|
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.
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!