Стоит ли искать приложение по умолчанию в реестре при открытии файла из приложения C #? - PullRequest
0 голосов
/ 20 мая 2009

Я создаю приложение (сторонний проект, который может заручиться поддержкой сообщества stackoverflow более чем один раз), для которого потребуется открывать файлы различных типов (т.е. открывать документы Word в Word, а не исходно в моем приложении).

Я играл с некоторым кодом для поиска приложения по умолчанию для типа файла в реестре и передачи его в Process.Start (). Кажется, есть два вопроса с этим подходом:

1) В некоторых случаях имя приложения указывается в кавычках, а в других нет.
2) Process.Start () требует, чтобы путь к приложению и его аргументы передавались отдельно (например, Process.Start ("notepad.exe", @ "C: \ myfile.txt"); вместо Process.Start (@ "notepad) .exe C: \ myfile.txt ");).

Это означает, что когда я получаю путь из реестра, мне нужно разделить его (после определения, нужно ли разделять на кавычки или пробелы), чтобы определить, какая часть является путем приложения, а какие - аргументами, а затем передать их отдельно. для Process.Start ().

Альтернативой может быть просто передать имя файла, как в Process.Start (@ "C: \ myfile.txt"), но я думаю, что это работает, только если приложение находится в переменной среды Path.

Какой путь лучше? В случае с реестром, есть ли общее решение для анализа аргументов?

Спасибо за любую помощь!

Обновление:
Я думаю, что короткий ответ «Нет».
Похоже, я действительно шел по пути излишнего, и передача только имени файла будет работать всякий раз, когда в реестре есть соответствующее значение. То есть Все, что я нахожу в реестре, Process.Start () уже знает, как это сделать.

Я обнаружил, что, когда я пытаюсь сделать это с «новым» типом файла, я получаю Win32Exception, в котором говорится: «Нет приложения, связанного с указанным файлом для этой операции». Фредрик Мёрк упоминает в комментарии, что это не происходит с ним в Vista. Какой правильный способ справиться с этим?

Ответы [ 3 ]

5 голосов
/ 20 мая 2009

Если расширение зарегистрировано для открытия в определенном приложении, оно не обязательно должно быть в PATH для запуска.

2 голосов
/ 20 мая 2009

Приложение не обязательно должно быть в PATH, если вы указываете только имя файла. Следующий код работал нормально для меня:

            System.Diagnostics.Process.Start(@"C:\Users\Dan\Desktop\minors.pdf");
0 голосов
/ 20 мая 2009

Обычно вам не нужно искать программу для зарегистрированных типов, и программе обычно не требуется указывать переменную среды PATH. Обычно команда в реестре содержит полный путь. Вот как выглядит команда для файлов .kml (Google Earth) (на моем компьютере):

C:\Program Files\Google\Google Earth\googleearth.exe "%1"

Учитывая это, вы можете безопасно использовать Process.Start вместе с именами файлов документов. В случае, если тип файла не зарегистрирован, вы будете вызывать поведение Windows по умолчанию для этого (спрашивать, какую программу использовать и т. Д.).

...