【问题标题】:How do I open a file using the shell's default handler?如何使用 shell 的默认处理程序打开文件?
【发布时间】:2009-05-01 14:13:38
【问题描述】:

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

    您确实可以只使用Process.Start(filename)。这是在docs for Process.Start 中指定的:

    通过指定进程启动进程 文件名类似于键入 运行对话框中的信息 Windows 开始菜单。因此, 文件名不需要代表 一个可执行文件。它可以是任何 扩展名具有的文件类型 与应用程序相关联 安装在系统上。例如 文件名可以有 .txt 如果您有关联的文本,则扩展名 带有编辑器的文件,例如记事本, 或者它可以有一个 .doc 如果你有 带有单词的 associated.doc 文件 处理工具,例如 Microsoft 单词。同样,以同样的方式 运行对话框可以接受 带或不带的可执行文件名 .exe 扩展名,.exe 扩展名 在 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 是默认值,但因为它绝对是必需的,所以我想明确指定它以使读者更清楚。

    【讨论】:

    • Process.Start("C:\temp\test.xlsx"); 打开 xlsx 文件,如果 Excel 已安装。如果没有安装,我不知道。
    • 您的旧答案现在与 dotnet 核心应用非常相关,再次需要 UseShellExecute=true
    【解决方案2】:

    不确定是否正常

    System.Diagnostics.Process.Start(filePath);
    

    【讨论】:

      【解决方案3】:

      由于这个问题是 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 });
      

      【讨论】:

        【解决方案4】:

        System.Diagnostics.Process 为 shell32.ShellExecute 提供 .Net 原生包装器。

        有关这两种 API 的讨论,请参阅 PInvoke.Net,以及 MSDN 上的 MSDN 文档。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-31
          • 1970-01-01
          • 1970-01-01
          • 2020-08-29
          相关资源
          最近更新 更多