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

Sim*_*mon 26 .net c# winforms

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

Jon*_*eet 61

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

你确实可以使用Process.Start(filename).这在以下文档中Process.Start指定:

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

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

如果您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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这会在记事本中打开test.txt.

事实上,这UseShellExecute=true是默认的,但是因为它肯定是必需的,我喜欢明确地指定它以使读者更清楚.

  • 您的旧答案现在与 dotnet 核心应用程序非常相关,其中再次需要 `UseShellExecute=true`。 (3认同)

Des*_*ond 8

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

Process.Start(new ProcessStartInfo(filePath) { UseShellExecute = true });
Run Code Online (Sandbox Code Playgroud)

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

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


Jas*_*son 6

不确定它是否正常

System.Diagnostics.Process.Start(filePath);
Run Code Online (Sandbox Code Playgroud)