【发布时间】:2009-05-01 14:13:38
【问题描述】:
我们的客户端(一个 winforms 应用程序)包括一个文件浏览器。我希望用户能够使用 shell 的默认处理程序打开选定的文件。我怎么做?我读过我应该使用 Win32 API 而不是注册表,但我更喜欢只涉及 .NET 的解决方案。
【问题讨论】:
我们的客户端(一个 winforms 应用程序)包括一个文件浏览器。我希望用户能够使用 shell 的默认处理程序打开选定的文件。我怎么做?我读过我应该使用 Win32 API 而不是注册表,但我更喜欢只涉及 .NET 的解决方案。
【问题讨论】:
编辑:更新、更简单的答案。
您确实可以只使用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 已安装。如果没有安装,我不知道。
UseShellExecute=true。
不确定是否正常
System.Diagnostics.Process.Start(filePath);
【讨论】:
由于这个问题是 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 });
【讨论】:
System.Diagnostics.Process 为 shell32.ShellExecute 提供 .Net 原生包装器。
有关这两种 API 的讨论,请参阅 PInvoke.Net,以及 MSDN 上的 MSDN 文档。
【讨论】: