Открыть файл с соответствующим приложением

Я хочу обратиться за помощью к открытию файла из приложения 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, и под этим ключом находится в shell-> Open-> Command путь:

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

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

Для просмотра Irfan или другого зарегистрированного приложения нет ddeexec, просто обычная команда вроде

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

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

Поэтому мой вопрос: как я могу настроить объект ProcessStartInfo чтобы гарантировать, что он будет запускать все файлы, как это было бы в проводнике, с помощью doubleclick, стандартов и этих DDEExec ? Есть ли что-то другое, как DDEExec о котором я должен знать? спасибо и извините за мой EN

Просто пиши

 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"); ... 

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

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

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

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

  • Как определить программным способом, является ли конкретный процесс 32-разрядным или 64-разрядным
  • В Windows, как я могу изящно попросить запущенную программу завершить работу?
  • запустить exe / process с stdin stdout и stderr?
  • Opendirectoryd потребляет 40% процессора
  • Доступ запрещен при получении пути процесса
  • Какова задача «java» (родительский процесс «launchd»), выполняемый на MacOS X?
  • .NET - WindowStyle = hidden vs. CreateNoWindow = true?
  • Как проверить, существует ли процесс с данным pid в Python?
  • Linux: Есть ли что-то похожее на «верх» для ввода-вывода?
  • Как измерить общее использование ОЗУ в программе под Windows?
  • Windows 7 - Высокая загрузка процессора во время простоя
  • Давайте будем гением компьютера.