84

我想寻求有关从 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 应用程序的 (jpg) 图像。Irfanview 协会运作良好,MS 办公文件也很好。在尝试打开与 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 视图或其他检查的应用程序,没有 ddeexec,只有普通命令,如

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

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

所以我的问题是,我如何设置ProcessStartInfo对象以确保它通过双击运行所有文件,就像它在资源管理器中一样,标准和这个DDEExec?还有其他类似DDEExec的事情我应该注意吗?谢谢和对不起我的英文

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

4

3 回答 3

132

写吧

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

于 2012-04-16T12:38:28.740 回答
51

.Net Core(从 v2.2 开始)中,它应该是:

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

相关的github问题可以在这里找到

于 2019-02-19T10:25:55.737 回答
23

这是一个旧线程,但以防万一有人像我一样遇到它。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 可能会很有用。

于 2013-07-23T09:59:17.153 回答