Подтвердить что ты не робот

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

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

      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 → Команда путь:

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Это старая тема, но на тот случай, если кто-нибудь столкнется с ней, как я. Для 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)

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

Ответ 3

В .Net Core (начиная с v2.2) это должно быть:

new Process
{
    StartInfo = new ProcessStartInfo(@"file path")
    {
        UseShellExecute = true
    }
}.Start();

Связанную проблему GitHub можно найти здесь