Click here to Skip to main content
15,897,704 members
Articles / Programming Languages / C#

HardLinks - Manage your library of common classes

Rate me:
Please Sign up or sign in to vote.
4.55/5 (4 votes)
5 Mar 2004CPOL3 min read 59.8K   1.4K   30  
A tool for managing NTFS hard links
using System;
using System.Collections;
using System.Diagnostics;
using Microsoft.Win32;

namespace HardLinks
{
	public enum Linked { Linked, FileExists, NoFile }

	public class File
	{
		public string RealDirectoryName = "";
		public string LinkDirectoryName = "";
		public string FileName = "";

		public Linked Linked = Linked.FileExists;

		public override string ToString() { return FileName; }
	}

	public class LinkDirectory
	{
		public string RealDirectoryName = "";
		public string LinkDirectoryName = "";

		// key=FileName value=File
		public Hashtable Files = new Hashtable();

		public override string ToString() { return LinkDirectoryName; }

		public bool Exists( File TestFile )
		{
			File File = (File) Files[ TestFile.FileName ];
			if ( File == null ) return false;

			return true;
		}

		public void Add( File NewFile )
		{
			File File = (File) Files[ NewFile.FileName ];
			if ( File != null ) { Debug.Assert( false ); return; }

			Files.Add( NewFile.FileName, NewFile );
		}
	}

	public class RealDirectory
	{
		public string RealDirectoryName = "";

		// key=LinkDirectoryName value=LinkDirectory
		public Hashtable LinkDirectories = new Hashtable();

		public override string ToString() { return RealDirectoryName; }

		public bool Exists( File TestFile )
		{
			LinkDirectory LinkDirectory = (LinkDirectory) LinkDirectories[ TestFile.LinkDirectoryName ];
			if ( LinkDirectory == null ) return false;

			return LinkDirectory.Exists( TestFile );
		}

		public void AddDirectory( string LinkDirectoryName )
		{
			LinkDirectory LinkDirectory = (LinkDirectory) LinkDirectories[ LinkDirectoryName ];
			if ( LinkDirectory == null )
			{
				LinkDirectory = new LinkDirectory();
				LinkDirectory.RealDirectoryName = RealDirectoryName;
				LinkDirectory.LinkDirectoryName = LinkDirectoryName;

				LinkDirectories.Add( LinkDirectory.LinkDirectoryName, LinkDirectory );
			}
		}

		public void RemoveDirectory( string LinkDirectoryName )
		{
			LinkDirectory LinkDirectory = (LinkDirectory) LinkDirectories[ LinkDirectoryName ];
			if ( LinkDirectory == null ) return;

			LinkDirectories.Remove( LinkDirectory.LinkDirectoryName );
		}

		public void Add( File NewFile )
		{
			LinkDirectory LinkDirectory = (LinkDirectory) LinkDirectories[ NewFile.LinkDirectoryName ];
			if ( LinkDirectory == null )
			{
				LinkDirectory = new LinkDirectory();
				LinkDirectory.RealDirectoryName = NewFile.RealDirectoryName;
				LinkDirectory.LinkDirectoryName = NewFile.LinkDirectoryName;

				LinkDirectories.Add( LinkDirectory.LinkDirectoryName, LinkDirectory );
			}

			LinkDirectory.Add( NewFile );
		}

		public void LoadFromRegistry( string Root, string RealDirectoryName )
		{
			LinkDirectories.Clear();

			RegistryKey RootKey = Registry.CurrentUser.OpenSubKey( Root );
			if ( RootKey == null ) return;

			string[] saLinkDirectories = RootKey.GetValueNames();
			foreach ( string sLinkDirectoryID in saLinkDirectories )
			{
				if ( sLinkDirectoryID.Length == 0 ) continue;

				string LinkDirectoryName = (string) RootKey.GetValue( sLinkDirectoryID );

				LinkDirectory NewLinkDirectory = new LinkDirectory();
				NewLinkDirectory.RealDirectoryName = RealDirectoryName;
				NewLinkDirectory.LinkDirectoryName = LinkDirectoryName;

				LinkDirectories.Add( NewLinkDirectory.LinkDirectoryName, NewLinkDirectory );
			}
		}

		public void SaveToRegistry( string Root )
		{
			RegistryKey RootKey = Registry.CurrentUser.OpenSubKey( Root, true );
			RootKey.SetValue( null, RealDirectoryName );

			int i = 0;
			foreach ( LinkDirectory LinkDirectory in LinkDirectories.Values )
			{
				string s = i.ToString( "00000000" );
				RootKey.SetValue( s, LinkDirectory.LinkDirectoryName );

				i++;
			}

			RootKey.Close();
		}
	}

	public class Links
	{
		// key=RealDirectoryName, value=RealDirectory
		public Hashtable RealDirectories = new Hashtable();

		public Links(){}

		public bool Exists( string RealRoot, string LinkRoot, string FileName )
		{
			RealDirectory RealDirectory = (RealDirectory) RealDirectories[ RealRoot ];
			if ( RealDirectory == null ) return false;

			File TestFile = new File();
			TestFile.RealDirectoryName = RealRoot;
			TestFile.LinkDirectoryName = LinkRoot;
			TestFile.FileName = FileName;

			return RealDirectory.Exists( TestFile );
		}

		public void AddDirectory( string RealDirectoryName )
		{
			RealDirectory RealDirectory = (RealDirectory) RealDirectories[ RealDirectoryName ];
			if ( RealDirectory == null )
			{
				RealDirectory = new RealDirectory();
				RealDirectory.RealDirectoryName = RealDirectoryName;

				RealDirectories.Add( RealDirectoryName, RealDirectory );
			}
		}

		public void AddDirectory( string RealDirectoryName, string LinkDirectoryName )
		{
			RealDirectory RealDirectory = (RealDirectory) RealDirectories[ RealDirectoryName ];
			if ( RealDirectory == null )
			{
				RealDirectory = new RealDirectory();
				RealDirectory.RealDirectoryName = RealDirectoryName;

				RealDirectories.Add( RealDirectoryName, RealDirectory );
			}

			RealDirectory.AddDirectory( LinkDirectoryName );
		}

		public void RemoveDirectory( string RealDirectoryName, string LinkDirectoryName )
		{
			RealDirectory RealDirectory = (RealDirectory) RealDirectories[ RealDirectoryName ];
			if ( RealDirectory == null ) return;

			if ( LinkDirectoryName.Length == 0 )
				RealDirectories.Remove( RealDirectory.RealDirectoryName );
			else
				RealDirectory.RemoveDirectory( LinkDirectoryName );
		}

		public void Add( string RealRoot, string LinkRoot, string FileName, Linked Linked )
		{
			if ( Exists( RealRoot, LinkRoot, FileName ) ) { Debug.Assert( false ); return; }

			File NewFile = new File();
			NewFile.RealDirectoryName = RealRoot;
			NewFile.LinkDirectoryName = LinkRoot;
			NewFile.FileName = FileName;
			NewFile.Linked = Linked;

			Add( NewFile );
		}

		public void Add( File NewFile )
		{
			RealDirectory RealDirectory = (RealDirectory) RealDirectories[ NewFile.RealDirectoryName ];
			if ( RealDirectory == null )
			{
				RealDirectory = new RealDirectory();
				RealDirectory.RealDirectoryName = NewFile.RealDirectoryName;

				RealDirectories.Add( RealDirectory.RealDirectoryName, RealDirectory );
			}

			RealDirectory.Add( NewFile );
		}

		public void Add( Links LinksToAdd )
		{
			foreach ( RealDirectory RealDirectory in LinksToAdd.RealDirectories.Values )
			foreach ( LinkDirectory LinkDirectory in RealDirectory.LinkDirectories.Values )
			{
				AddDirectory( RealDirectory.RealDirectoryName, LinkDirectory.LinkDirectoryName );

				foreach ( File File in LinkDirectory.Files.Values )
					Add( File );
			}
		}

		public void LoadFromRegistry()
		{
			RealDirectories.Clear();

			string Root = "Software\\Square One Software\\HardLinks\\Links";

			RegistryKey key = Registry.CurrentUser.OpenSubKey( Root );
			if ( key == null ) return;

			string[] saRealDirectories = key.GetSubKeyNames();
			foreach ( string sRealDirectoryID in saRealDirectories )
			{
				string Path = Root + "\\" + sRealDirectoryID;
				RegistryKey key2 = Registry.CurrentUser.OpenSubKey( Path );
				string RealDirectoryName = (string) key2.GetValue( null );

				RealDirectory newRealDirectory = new RealDirectory();
				newRealDirectory.RealDirectoryName = RealDirectoryName;

				newRealDirectory.LoadFromRegistry( Path, RealDirectoryName );

				RealDirectories.Add( RealDirectoryName, newRealDirectory );
			}
		}

		public void SaveToRegistry()
		{
			string Parent = "Software\\Square One Software\\HardLinks";
			string Root   = "Software\\Square One Software\\HardLinks\\Links";

			RegistryKey ParentKey = Registry.CurrentUser.CreateSubKey( Parent );
			ParentKey.Close();

			ParentKey = Registry.CurrentUser.OpenSubKey( Parent, true );
			try
			{
				ParentKey.DeleteSubKeyTree( "Links" );
			}
			catch {}
			ParentKey.Close();

			RegistryKey RootKey = Registry.CurrentUser.CreateSubKey( Root );
			RootKey.Close();

			RootKey = Registry.CurrentUser.OpenSubKey( Root, true );

			int i = 0;
			foreach ( RealDirectory RealDirectory in RealDirectories.Values )
			{
				string s = i.ToString( "00000000" );
				RootKey.CreateSubKey( s );

				RealDirectory.SaveToRegistry( Root + "\\" + s );

				i++;
			}

			RootKey.Close();
		}

		public void ScanDisk()
		{
			foreach ( RealDirectory RealDirectory in RealDirectories.Values )
			foreach ( LinkDirectory LinkDirectory in RealDirectory.LinkDirectories.Values )
			{
				LinkDirectory.Files.Clear();
				Add( Methods.ScanDisk( RealDirectory.RealDirectoryName, LinkDirectory.LinkDirectoryName ) );
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United Kingdom United Kingdom
I discovered C# and .NET 1.0 Beta 1 in late 2000 and loved them immediately.
I have been writing software professionally in C# ever since

In real life, I have spent 3 years travelling abroad,
I have held a UK Private Pilots Licence for 20 years,
and I am a PADI Divemaster.

I now live near idyllic Bournemouth in England.

I can work 'virtually' anywhere!

Comments and Discussions