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