2012-04-16 4 views
39

Я хочу обратиться за помощью к открытию файла из приложения C# с соответствующим приложением. Я попытался это:Открыть файл с соответствующим приложением

 ProcessStartInfo pi = new ProcessStartInfo(file); 
     pi.Arguments = Path.GetFileName(file); 
     pi.UseShellExecute = true; 
     pi.WorkingDirectory = Path.GetDirectoryName(file); 
     pi.FileName = file; 
     pi.Verb = "OPEN"; 
     Process.Start(pi); 

или это:

 Process.Start(file); 

где строка file в обоих примерах представляет собой полный путь к файлу, пытаясь открыть. Теперь все работает хорошо, за исключением изображений (jpg) с приложением ACDSee. Ассоциации Irfanview хорошо работают, документы MS Office тоже. После попытки открыть jpg-образ, связанный с acdsee, он просто запускает acdsee в области уведомлений и не открывает файл.

я обнаружил, что в реестре CLASSES_ROOT для * .jpg изображений, есть значение ACDSee.JPG в качестве ассоциированного приложения, и в этом ключе есть в оболочечной> Открыть-> Команда путь :

"C:\Program Files\ACD Systems\ACDSee\ACDSee.exe" /dde 

и я вещь, что это странно /dde причина, почему я не могу открыть файл. Я понял, что в одной и той же рег ключ оболочечной> Открыть есть некоторые DDEExec ввод ключа со значением [open("%1")]

для просмотра Ирфан или другого зарегистрированного приложения там не ddeexec, просто нормальная команда, как

"C:\Program Files (x86)\IrfanView\i_view32.exe" "%1" 

, которые можно запустить из командной строки после swaping% 1 для имени файла , но я не мог выполнить команду записи ACDSee в командной строке :(

Так что мой вопрос, как я могу настроить ProcessStartInfo object to убедитесь, что он будет работать со всеми файлами, как это было бы в проводнике doubleclick, стандартами и данными DDEExec? Есть ли что-то другое, как DDEExec, о котором я должен знать? спасибо и извините за мой EN

ответ

79

Просто напишите

System.Diagnostics.Process.Start(@"file path"); 

пример

System.Diagnostics.Process.Start(@"C:\foo.jpg"); 
System.Diagnostics.Process.Start(@"C:\foo.doc"); 
System.Diagnostics.Process.Start(@"C:\foo.dxf"); 
... 

И оболочка будет запускаться программа, ассоциированная чтение его из реестра, как обычно двойной щелчок делает.

+2

Похоже, он уже пробовал это с помощью 'Process.Start (file);'. –

+0

«Итак, мой вопрос, как я могу настроить объект ProcessStartInfo, чтобы гарантировать, что он будет запускать все файлы, как это было бы в проводнике, двойным щелчком»: ответ таков. Он использовал аргументы командной строки, как бы то ни было ... но не прямую инволюцию, насколько я вижу. – Tigran

+0

@ Тигран Марио прав, поскольку я написал, что попробовал ваше предложение в качестве второго примера ... Я хотел задать свой вопрос так, чтобы это явно не было правильным решением, поскольку jpg не открывается! – Zavael

9

Это старая нить, но на всякий случай кто-то сталкивается с ней, как я. Для параметра pi.FileName должно быть указано имя файла (и, возможно, полный путь к файлу) исполняемого файла, который вы хотите использовать, чтобы открыть файл. Следующий код работает для меня, чтобы открыть видеофайл с VLC.

string file = files[currentIndex].fileName; 
ProcessStartInfo pi = new ProcessStartInfo(file); 
pi.Arguments = Path.GetFileName(file); 
pi.UseShellExecute = true; 
pi.WorkingDirectory = Path.GetDirectoryName(file); 
pi.FileName = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe"; 
pi.Verb = "OPEN"; 
Process.Start(pi); 

ответ работа Тигран, но будет использовать приложение Windows' по умолчанию, чтобы открыть файл, так что использование ProcessStartInfo может быть полезно, если вы хотите, чтобы открыть файл с приложением, которое не используется по умолчанию.

+3

(: комментарий к старому ответу на старый поток :) Ответ Тиграна запускает самую последнюю связанную программу для расширений каждого файла. Ответ Дерева заставляет его использовать ** vlc .exe **. Вопрос Заваэля о том, что он _only_ имеет с ** ACDSee.exe ** и как он устанавливает свою ассоциацию расширений. Я думаю, об этом нужно связаться с авторами ACDSee. –

Смежные вопросы