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