使用关联的应用程序打开文件


70

我想从与关联应用程序的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两个示例中的字符串代表尝试打开的文件的完整路径。现在,一切正常,除了使用ACDSee app(jpg)图像。Irfanview协会运作良好,MS Office文件也是如此。尝试打开与acdsee关联的jpg图像后,它仅在通知区域中运行acdsee而不打开文件。

我发现,在* .jpg图像的注册表CLASSES_ROOT中,有一个ACDSee.JPG值作为关联的应用程序,在此键下的shell- > Open-> Command中有一个路径:

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

而且我觉得这很奇怪/dde是原因,为什么我无法打开文件。我意识到在同一个reg key shell-> Open中,有一些DDEExec键值[open("%1")]

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

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

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

所以我的问题是,我该如何设置ProcessStartInfo对象以确保它可以像双击资源管理器中的标准文件一样运行所有文件DDEExec?还有其他DDEExec我应该知道的东西吗?谢谢你,对不起我

Answers:


121

写就好了

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将运行关联的程序,从注册表中读取它,就像通常的双击一样。


2
看来他已经尝试过了Process.Start(file);
Mario S

“所以,我的问题是,如何通过双击设置ProcessStartInfo对象以确保它将运行资源管理器中的所有文件”:答案是那样的。就我所知,他使用命令行参数,无论如何……但不直接调用。
Tigran 2012年

@Tigran Mario是正确的,正如我写的那样,我尝试了您的建议作为第二个示例...我想以一种明显不适合的解决方案的方式提出问题,因为jpg未打开!
Zavael 2012年

@Zavael:在我的机器上,它会打开Windows默认编辑器,所以我认为在您的系统上,它应该只打开已安装并与该格式相关联的最新软件。
Tigran 2012年

@Tigran就像我写的那样,如果我有Irfanview,就可以了,如果我有Word文档,就可以了,即使Windows查看器也能正常工作,但它们的命令位于一个reg值中…… DDEExec注册表项,我想这是为了一起构建命令,因此它不起作用...而且不仅在我的机器上..尝试安装acdsee 4并运行代码
Zavael 2012年


19

这是一个旧线程,但以防万一有人像我一样遇到它。pi.FileName需要设置为您要用来打开文件的可执行文件的文件名(可能还有file的完整路径)。以下代码对我有用,用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
(:对旧线程的旧响应的注释:) Tigran的答案为每个文件的扩展名运行最新的关联程序。树的答案强制其使用vlc.exe。Zavael的问题是关于他在使用ACDSee.exe时遇到的麻烦以及如何设置其扩展关联。我认为需要就此与ACDSee的作者联系。
Jesse Chisholm 2014年

它是acdsee的旧版本,我没有用新的进行验证,因此我没有联系他们,只是为了提供信息:)
Zavael
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.