Заранее извиняюсь за еще один вопрос о файловых ассоциациях. Я изменил код, который я использую для создания ассоциации файлов, чтобы он использовал HKEY_CURRRENT_USER \ Software \ Classes. Это снимает проблему с требованием прав администратора (спасибо Дэвиду Хеффернану за то, что он настаивал на этом).
Я обнаружил, что продолжающееся создание ассоциации файлов не дублирует ее в реестре, а изменяет данные. Поэтому, если я назначаю другой исполняемый файл, он заменяет предыдущий на текущий. Однако я хотел увидеть, как полностью очистить файловую ассоциацию. Я просто ищу запись и, если она есть, вынимаю ключ:
public static void RemoveAssociation(string extension) {
if (!IsAssociated(extension)) return;
var currentUser = Registry.CurrentUser;
var softwareKey = getKey(currentUser, "Software");
if (softwareKey != null) {
var softwareClasses = getKey(softwareKey, "Classes");
if (softwareClasses != null) {
softwareClasses.DeleteSubKey(extension);
}
}
}
IsAssociated просто ищет ключ расширения в HKEY_CURRENT_USER \ Software \ Classes
Это удаляет ключ, но не все записи в реестре. Я нашел запись в HKEY_CLASSES_ROOT, а также в HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ EXTENSIONS. (Я использую Win 7, поэтому я предполагаю, что это будет в XP и Vista?)
Двойной щелчок по расширению теперь приводит к появлению диалогового окна, сообщающего, что окна не могут найти связанный исполняемый файл (предположительно, потому что я оставил ключ в CLASSES_ROOT, но удалил соединение, удалив ключ)
Так как мне удалить все ссылки на расширение?
Спасибо
EDIT
Это код, который я использую для создания ассоциации:
public static void Associate(string extension, string progID, string description, string icon, string application) {
if (extension == null) return;
if (String.IsNullOrEmpty(progID)) return;
if (String.IsNullOrEmpty(application)) return;
var currentUser = Registry.CurrentUser;
var softwareKey = getKey(currentUser, "Software");
if (softwareKey != null) {
var softwareClasses = getKey(softwareKey, "Classes");
if (softwareClasses != null) {
softwareClasses.CreateSubKey(extension).SetValue("", progID);
using (var key = softwareClasses.CreateSubKey(progID)) {
if (description != null)
key.SetValue("", description);
if (icon != null)
key.CreateSubKey("DefaultIcon").SetValue("", toShortPathName(icon));
//if (application != null)
key.CreateSubKey(@"Shell\Open\Command").SetValue("", toShortPathName(application) + " \"%1\"");
}
}
}
}