打开带有相关应用程序的文

时间:2012-04-16 12:33:44

标签: c# process file-association

我想请求帮助从c#app打开一个带有相关应用的文件。 我试过这个:

      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->打开 - >命令路径:

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

我认为这个奇怪的/dde是原因,为什么我无法打开文件。我意识到,在相同的注册表项 shell->打开中,有一些DDEExec键值条目[open("%1")]

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

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

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

所以我的问题是,我如何设置ProcessStartInfo对象确保它将运行所有文件,因为它将在资源管理器中通过双击,标准和此DDEExec个?我还应该注意其他像DDEExec这样的东西吗? 谢谢,对不起我的EN

3 个答案:

答案 0 :(得分:102)

只需写下

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

答案 1 :(得分:14)

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

答案 2 :(得分:1)

.Net Core (自v2.2起)中,它应该是:

adapter.setOnItemRemoveListener(new RemoveItemAdapter.OnItemRemoveListener() {
    @Override
    public void onItemRemove(int position) {
        //Do I send it from here?

    }
});

相关的github问题可以找到here