Связь типа файла с приложением (C#)
У меня есть несколько вопросов, связанных с:
1) Можно ли заставить мою программу изменить ассоциацию типов файлов, но только когда она запущена? Вы видите что-то не так с этим поведением?
2) Другой вариант, который я вижу, - позволить пользователям решить открыть с моим приложением или восстановить ассоциацию по умолчанию... что-то вроде: "захватить все файлы.lala" или "восстановить ассоциацию.lala". Как я могу это сделать? Как вы думаете, это лучший подход?
4 ответа
Что касается файловых ассоциаций, я написал ответ ранее, который по крайней мере охватывает "Как".
Это также должно указать вам правильное направление, как обрабатывать резервное копирование и восстановление. При прямом доступе к реестру через C# вам не нужно будет использовать файлы.reg, поэтому вы можете создать резервную копию предыдущего значения, как вам нравится в вашем приложении, а также восстановить его оттуда.
Ключевой вопрос здесь: стоит ли менять файловые ассоциации случайным образом? По крайней мере, было бы необходимо попросить пользователя заранее (как вы также указали).
Кроме того, пользователи Vista с включенным UAC или непривилегированные пользователи других версий Windows могут не иметь необходимых прав для изменения глобальных ассоциаций файлов. (Не) процедура установки вашей программы может быть единственным местом, где это может быть успешным.
РЕДАКТИРОВАТЬ
Как указал в своем ответе Франси Пенов, есть способ изменить локальные ассоциации файлов для каждого пользователя, даже для не администраторов (поэтому я говорил о "глобальных ассоциациях" в предыдущем абзаце). Он также упомянул упомянутое, почему посещение там не слишком рекомендуется.
Вы можете реализовать изменение сопоставления файлов "на лету", связав небольшой исполняемый файл с этим расширением файла, который при запуске проверит, работает ли ваше основное приложение, и передаст ему имя файла или, если он не запущен, вызовет " обычное "связанное приложение.
Основным преимуществом этого подхода является то, что вам нужно гадить с реестром только один раз.
Основными недостатками этого подхода являются:
- вам нужен вспомогательный процесс
- приложение, которое "владеет" этими расширениями файлов, может обнаружить изменение и пожаловаться пользователю, вызвав "восстановление", тем самым вытащив вас из поля зрения.
Кроме того, вы можете изменить ассоциацию файлов при запуске вашей основной программы. Это будет работать даже для пользователей без прав администратора. в то время как файловые ассоциации хранятся в HKEY_CLASSES_ROOT
есть маленькая хитрость - HKCR на самом деле карта обоих HKEY_LOCAL_MACHINE\SOFTWARE\Classes
а также HKEY_CURRENT_USER\SOFTWARE\Classes
, Таким образом, вы можете временно зарегистрировать расширение файла для текущего пользователя в HKCU и "скрыть" исходную ассоциацию от HKLM.
Конечно, я бы посоветовал не использовать этот подход, поскольку для того, чтобы сделать эту связь постоянной, требуется всего один сбой в вашем приложении, и поскольку очень немногие приложения знают, как обращаться с ассоциациями файлов в HKCU, есть вероятность, что это будет неисправимая ситуация для оригинальное приложение.
Возможно, это можно сделать, но я думаю, что это окажется громоздким. Все ассоциации типов файлов хранятся в реестре, поэтому вам придется писать / возвращать записи реестра каждый раз, когда ваше приложение запускается и останавливается. Кроме того, в зависимости от того, как часто вы это делаете, новые ассоциации могут не сразу обнаруживаться в проводнике Windows.
Связи перечислены в HKEY_CLASSES_ROOT в реестре и могут быть отображены целым множеством способов (mime types/progIDs/etc).
Многие приложения, которые я видел, спрашивают, хотите ли вы связать определенные типы файлов с приложением во время установки, и дают вам возможность отказаться и оставить текущие настройки.
Я не думаю, что я бы рекомендовал "на лету" ассоциации типов файлов
1) вы можете определить типы файлов, которые находятся в раскрывающемся списке типов файлов Open Dialog. Помимо этого, можно изменить тип файла по умолчанию при открытии приложения, а затем заменить при закрытии приложения, так как сопоставление типов файлов является просто параметром реестра.
Что касается неправильно, я бы не стал. Первая причина в том, что это не стандартное поведение приложений. Вторая причина заключается в том, что если ваше приложение или компьютер неожиданно завершают работу, вы рискуете не вернуть ассоциацию к исходным настройкам.
2) Windows по умолчанию позволяет пользователю выбирать эти параметры, используя правую кнопку мыши и команду "открыть с помощью".