using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Security.AccessControl;
using System.IO;
//CREATED BY AIDAN MICHAEL FOLLESTAD
//COPYWRITE 2010, AF PRODUCTIONS.
namespace Associations
{
class RegistryUtilities
{
public bool RenameSubKey(RegistryKey parentKey, string subKeyName, string newSubKeyName)
{
CopyKey(parentKey, subKeyName, newSubKeyName);
parentKey.DeleteSubKeyTree(subKeyName);
return true;
}
public bool CopyKey(RegistryKey parentKey, string keyNameToCopy, string newKeyName)
{
//Create new key
RegistryKey destinationKey = parentKey.CreateSubKey(newKeyName, RegistryKeyPermissionCheck.ReadWriteSubTree);
//Open the sourceKey we are copying from
RegistryKey sourceKey = parentKey.OpenSubKey(keyNameToCopy, RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl);
RecurseCopyKey(sourceKey, destinationKey);
return true;
}
private void RecurseCopyKey(RegistryKey sourceKey, RegistryKey destinationKey)
{
//copy all the values
foreach (string valueName in sourceKey.GetValueNames())
{
object objValue = sourceKey.GetValue(valueName);
RegistryValueKind valKind = sourceKey.GetValueKind(valueName);
destinationKey.SetValue(valueName, objValue, valKind);
}
//For Each subKey
//Create a new subKey in destinationKey
//Call myself
foreach (string sourceSubKeyName in sourceKey.GetSubKeyNames())
{
RegistryKey sourceSubKey = sourceKey.OpenSubKey(sourceSubKeyName,
RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
RegistryKey destSubKey = destinationKey.CreateSubKey(sourceSubKeyName,
RegistryKeyPermissionCheck.ReadWriteSubTree);
RecurseCopyKey(sourceSubKey, destSubKey);
}
}
}
///
/// Reference to an .ico file used by AF_FileAssociator.
///
public class ProgramIcon
{
public ProgramIcon(string iconPath)
{
IconPath = iconPath.Trim();
}
public readonly string IconPath;
public bool IsValid
{
get
{
FileInfo getInfo = new FileInfo(IconPath);
if (getInfo.Exists && getInfo.Extension == ".ico")
return true;
else
return false;
}
}
}
///
/// Reference to an list of executable files used by AF_FileAssociator.
///
public class OpenWithList
{
public OpenWithList(string[] openWithPaths)
{
List toReturn = new List();
FileInfo getInfo;
foreach (string file in openWithPaths)
{
getInfo = new FileInfo(file);
toReturn.Add(getInfo.Name);
}
List = toReturn.ToArray();
}
public readonly string[] List;
}
///
/// Reference to a executable file used by AF_FileAssociator.
///
public class ExecApplication
{
public ExecApplication(string appPath)
{
Path = appPath.Trim();
}
public readonly string Path;
///
/// Gets a value indicating whether this Executable Application is an .exe, and that it exists.
///
public bool IsValid
{
get
{
FileInfo getInfo = new FileInfo(Path);
if (getInfo.Exists)
return true;
else
return false;
}
}
}
///
/// AF_Lib's class for associating files with programs and icons.
///
public class AF_FileAssociator
{
///
/// Initializes a new AF_FileAssociator class object for the specified file extension.
///
/// the file extension to control (such as .txt).
public AF_FileAssociator(string extension)
{
Extension = extension;
}
///
/// Gets the extension set for this file associator to control when you initialized it.
///
public readonly string Extension;
string GetProgID
{
get
{
string toReturn = string.Empty;
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("") != null)
{
toReturn = Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("").ToString();
}
}
return toReturn;
}
}
///
/// Gets a value indicating whether the association keys exist. If the extension key doesn't, the program cannot get the name of the program association key making it appear to not exist.
///
public bool Exists
{
get
{
bool extKeyExists = false;
bool progIDkeyExists = false;
if (Registry.ClassesRoot.OpenSubKey(Extension) != null)
{
extKeyExists = true;
if (GetProgID != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID) != null)
{
progIDkeyExists = true;
}
}
}
if (extKeyExists && progIDkeyExists)
return true;
else
return false;
}
}
///
/// Create or overwrite a current file association for this FileAssociator's set extension.
///
/// The basic application name that uses this file extension.
/// The desription of this file extension and/or program that uses it.
/// The icon to show on the program and it's files.
/// The application that will be run when the file extension is clicked.
/// The programs that appear in the OpenWith list.
/// Thrown when an error occurs that will prevent it from working correctly.
public void Create(string progID, string description, ProgramIcon defaultIcon, ExecApplication execApp, OpenWithList openWith)
{
if (progID != null)
{
if (defaultIcon.IsValid && execApp.IsValid)
{
Registry.ClassesRoot.CreateSubKey(Extension).SetValue("", progID);
RegistryKey key = Registry.ClassesRoot.CreateSubKey(progID,
RegistryKeyPermissionCheck.ReadWriteSubTree);
if (description != null)
key.SetValue("", description, RegistryValueKind.String);
if (defaultIcon != null && defaultIcon.IsValid)
key.CreateSubKey("DefaultIcon").SetValue("", defaultIcon.IconPath, RegistryValueKind.String);
else
throw new Exception("The default icon you entered is either null or doesn't exist...");
if (execApp != null && execApp.IsValid)
key.CreateSubKey(@"Shell\Open\Command").SetValue("", execApp.Path + " %1", RegistryValueKind.String);
else
throw new Exception("The executable application you entered is either null or not an .exe format...");
if (openWith != null)
{
key = key.CreateSubKey("OpenWithList", RegistryKeyPermissionCheck.ReadWriteSubTree);
foreach (string file in openWith.List)
{
key.CreateSubKey(file);
}
}
key.Flush();
key.Close();
}
else
{
throw new Exception("Either the icon or executable application object is invalid...");
}
}
else
{
throw new Exception("The program ID you entered is null...");
}
}
///
/// Gets or sets the program ID for this extension.
///
public string ID
{
get
{
string toReturn = string.Empty;
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
toReturn = GetProgID;
}
else
{
throw new Exception("The extension's association key (" + GetProgID + ") doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
return toReturn;
}
set
{
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
string beforeID = GetProgID;
RegistryUtilities reg = new RegistryUtilities();
reg.RenameSubKey(Registry.ClassesRoot, beforeID, value);
Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).SetValue("", value,
RegistryValueKind.String);
}
else
{
throw new Exception("The extension's association key (" + GetProgID + ") doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
}
}
///
/// Gets or sets the description for this file extension and/or it's program association.
///
public string Description
{
get
{
string toReturn = string.Empty;
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("") != null)
{
toReturn = Registry.ClassesRoot.OpenSubKey(GetProgID,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("").ToString();
}
}
else
{
throw new Exception("The extension's progam association key (" + GetProgID + ") doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
return toReturn;
}
set
{
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
Registry.ClassesRoot.OpenSubKey(GetProgID,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).SetValue("", value, RegistryValueKind.String);
}
else
{
throw new Exception("The extension's progam association key (" + GetProgID + ") doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
}
}
///
/// Gets or sets the icon shown on this file extension and/or it's program association.
///
public ProgramIcon DefaultIcon
{
get
{
ProgramIcon toReturn = null;
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\DefaultIcon",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\DefaultIcon",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("") != null)
{
toReturn = new ProgramIcon(Registry.ClassesRoot.OpenSubKey(GetProgID + @"\DefaultIcon",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("").ToString());
}
}
}
else
{
throw new Exception("The extension's progam default icon association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
return toReturn;
}
set
{
if (this.Exists)
{
if (value.IsValid)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\DefaultIcon",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
Registry.ClassesRoot.OpenSubKey(GetProgID + @"\DefaultIcon",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).SetValue("", value.IconPath, RegistryValueKind.String);
}
else
{
throw new Exception("The extension's progam default icon association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The value your trying to set to this DefaultIcon variable is not valid... the icon doesn't exist or it's not an .ico file.");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
}
}
///
/// Gets or sets the executable ran when this file extension is opened.
///
public ExecApplication Executable
{
get
{
ExecApplication execApp = null;
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\Shell\Open\Command",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\Shell\Open\Command",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("") != null)
{
string path = Registry.ClassesRoot.OpenSubKey(GetProgID + @"\Shell\Open\Command",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetValue("").ToString();
execApp = new ExecApplication(path.Substring(0, path.LastIndexOf('%') - 1));
}
}
else
{
throw new Exception("The extension's progam executable association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
return execApp;
}
set
{
if (this.Exists)
{
if (value.IsValid)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\Shell\Open\Command",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
Registry.ClassesRoot.OpenSubKey(GetProgID + @"\Shell\Open\Command",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).SetValue("", value.Path + " %1", RegistryValueKind.String);
}
else
{
throw new Exception("The extension's progam executable association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The value uses to set this variable isn't valid... the file doesn't exist or it's not an .exe file.");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
}
}
///
/// Gets or sets the list of programs shown in the OpenWith list.
///
public OpenWithList OpenWith
{
get
{
OpenWithList toReturn = null;
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\OpenWithList",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
List list = new List();
foreach (string file in Registry.ClassesRoot.OpenSubKey(GetProgID + @"\OpenWithList",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl).GetSubKeyNames())
{
list.Add(file);
}
toReturn = new OpenWithList(list.ToArray());
list.Clear();
}
else
{
throw new Exception("The extension's progam open with executable association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
return toReturn;
}
set
{
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
if (Registry.ClassesRoot.OpenSubKey(GetProgID + @"\OpenWithList",
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
Registry.ClassesRoot.DeleteSubKeyTree(GetProgID + @"\OpenWithList");
RegistryKey key = Registry.ClassesRoot.CreateSubKey(GetProgID + @"\OpenWithList",
RegistryKeyPermissionCheck.ReadWriteSubTree);
foreach (string file in value.List)
{
key.CreateSubKey(file);
}
key.Close();
}
else
{
throw new Exception("The extension's progam open with executable association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("The extension association key doesn't exist, please use the Create() function to setup everything...");
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
}
}
///
/// Deletes all registry resources used for this file associations.
///
public void Delete()
{
if (this.Exists)
{
if (Registry.ClassesRoot.OpenSubKey(Extension,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.FullControl) != null)
{
try
{
Registry.ClassesRoot.DeleteSubKeyTree(GetProgID);
Registry.ClassesRoot.DeleteSubKeyTree(Extension);
}
catch (Exception ex)
{
throw new Exception("Failed to delete all keys used in the '" + Extension + "' file association, error: " + ex.Message);
}
}
}
else
{
throw new Exception("One of your association keys don't exist, use the create method to get started...");
}
}
}
}