打开与关联应用程序相关联的文件

我想请求帮助打开一个文件从 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 办公文档也是如此。在尝试打开与 acdsee 关联的 jpg 映像之后,它只是在通知区域运行 acdsee,并且不打开文件。

我发现,在注册表 类 _ 根中 * 。Jpg 图片,有一个 ACDSee.JPG 值作为相关的应用程序,在这个键下有一个路径在 Shell-> Open-> Command:

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

我认为这个奇怪的 /dde是原因,为什么我不能打开文件。我意识到在同一个 reg 键 Shell-> Open中有一些值为 [open("%1")]DDEExec键条目

对于 Irfan 视图或其他已检查的应用程序,没有 ddeexec,只有普通的命令,如

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

在将% 1换为文件名 ,但是我无法从命令行中的 acdsee 条目运行该命令: (之后,可以从命令行运行

所以我的问题是,我怎样才能将 ProcessStartInfo对象设置为 确保它将运行所有文件,就像它在资源管理器中那样,通过双击标准和这个 DDEExec?还有其他类似 DDEExec的东西我需要注意的吗? 非常感谢和对不起我的 EN

更新 : 因为这个问题仍然得到赞成票,我想澄清一下,接受的回答是有效的。我只对旧版本的 ACDSee 有问题,而对 Process.Start命令或 jpg扩展没有问题。

123991 次浏览

Just write

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

example

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

And shell will run associated program reading it from the registry, like usual double click does.

This is an old thread but just in case anyone comes across it like I did. pi.FileName needs to be set to the file name (and possibly full path to file ) of the executable you want to use to open your file. The below code works for me to open a video file with 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's answer works but will use windows' default application to open your file, so using ProcessStartInfo may be useful if you want to open the file with an application that is not the default.

In .Net Core (as of v2.2) it should be:

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

Related github issue can be found here