如何使用shell的默认处理程序打开文件?

时间:2009-05-01 14:13:38

标签: c# .net winforms

我们的客户端(winforms应用程序)包含文件浏览器。我希望用户能够使用shell的默认处理程序打开所选文件。我怎么做?我已经读过我应该使用Win32 API而不是注册表,但我更喜欢只涉及.NET的解决方案。

4 个答案:

答案 0 :(得分:59)

编辑:更新,更简单的答案。

您确实可以使用Process.Start(filename)。这在docs for Process.Start

中指定
  

通过指定进程来启动进程   文件名与输入类似   “运行”对话框中的信息   Windows开始菜单。因此,   文件名不需要表示   可执行文件。它可以是任何   扩展名所具有的文件类型   与应用程序相关联   安装在系统上。例如   文件名可以有.txt   扩展名如果您有相关文本   带有编辑器的文件,如记事本,   或者它可以有.doc,如果你有   带有单词的associated.doc文件   处理工具,如Microsoft   字。同样,以同样的方式   “运行”对话框可以接受   带或不带的可执行文件名   .exe扩展名,.exe扩展名   在fileName参数中是可选的。   例如,您可以设置fileName   参数“Notepad.exe”或   “记事本”。

编辑:原创,复杂的答案:

如果您将Process.Start与该文件一起用作“可执行文件”并指定UseShellExecute = true它就可以正常工作。例如:

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        ProcessStartInfo psi = new ProcessStartInfo("test.txt");
        psi.UseShellExecute = true;
        Process.Start(psi);
    }
}

在记事本中打开test.txt。

事实上,UseShellExecute=true是默认值,但由于它是明确要求的,我希望明确指定它以使读者更清楚。

答案 1 :(得分:6)

不确定是否可以

System.Diagnostics.Process.Start(filePath);

答案 2 :(得分:2)

System.Diagnostics.Process提供围绕shell32.ShellExecute的.Net本机包装。

有关API和PInvoke.Net上的MSDN文档的讨论,请参阅MSDN

答案 3 :(得分:1)

由于此问题是 Google 中的第一个结果,因此我将针对 .NET Core 和 .NET 5 向上添加此更新的答案。您需要添加 UseShellExecute = true。

Process.Start(new ProcessStartInfo(filePath) { UseShellExecute = true });

它比之前的 .NET Framework 更麻烦,但您可以将其包装在自定义方法中:

    public static void OpenFile(string filePath) 
        => Process.Start(new ProcessStartInfo(filePath) { UseShellExecute = true });