使用Process.Start打开文件夹

199

我看到了另一个主题,但我遇到了其他问题。进程已经启动(在任务管理器中看到),但是文件夹并没有在我的屏幕上打开。出了什么问题?

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

你确定你的路径是正确的吗? - Nathan Koop
1
为什么要手动调用资源管理器呢?为什么不直接打开文件夹,即使用ProcessStartInfo设置UseShellExecute属性为true并将Verb属性设置为"open",然后调用Process.Start方法呢? - OregonGhost
1
是的,我尝试打开没有路径的“explorer.exe”,也没有成功。 - Daniel
我没有发帖是因为问题不在于如何打开文件夹,而在于如何运行explorer.exe来打开文件夹。我只是想知道你为什么要直接调用explorer,因为可能有原因;) - OregonGhost
我只是想排除一些选项,所以这可能是个愚蠢的问题:你不是在Linux上使用mono做这件事,对吧?我们说的是Windows环境吗? - Fredrik Mörk
是的,Visual Studio | Windows Vista Business。 - Daniel
13个回答

328

您确定文件夹 "c:\teste" 存在吗?如果不存在,Windows资源管理器将会打开显示一些默认文件夹(在我的情况下是 "C:\Users\[user name]\Documents")。

更新

我已经尝试了以下变化:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

如果这些方法(除了抛出异常的那个)都不能在你的电脑上正常工作,我认为问题不在代码中,而是环境出了问题。如果是这种情况,我建议尝试以下一项或两项:

  • 打开运行对话框,输入“explorer.exe”,然后按回车键
  • 打开命令提示符窗口,输入“explorer.exe”,然后按回车键

那么,这可能是环境问题...我通过cmd打开了explorer.exe并正常运行了。除了“Process.Start(@”c:\ does_not_exist“);”引发异常外,没有任何Processs.Start起作用。 - Daniel
2
如果资源管理器窗口已经打开,那么使用 Process.Start(path) 会激活该窗口(可能只是在任务栏中闪烁,而不是置于前台);而使用 explorer.exe+参数则总是在前台打开一个新窗口(但可能会多次打开同一个窗口)。因此,两者都有缺点。 - KekuSemau
1
Process.Start(@"c:\temp") 使用时必须小心。如果存在 c:\temp.com,则函数调用将打开 c:\temp.com 而不是 c:\temp。详见 https://forums.iis.net/p/1239773/2144186.aspx 获取更多详情。 - Lex Li
1
请注意,Process.Start(@"c:\temp") 可能会打开不同的文件夹,例如 C:\temp.exeC:\temp.cmd。请参见此问题,其中 VS 本身表现出有缺陷的行为。您可以通过使用 explorer.exe 变体或(在我看来更好)始终附加 Path.DirectorySeparatorChar 来避免这种情况。例如,Process.Start(@"C:\temp\") - binki
这个方法在使用.NET Framework时对我有效,但在使用.NET Core 3时无效。我不得不创建一个ProcessStartInfo并设置UseShellExecute = true - Walt D
显示剩余2条评论

87

仅供完整性考虑,如果你想做的只是打开一个文件夹,可以使用以下方法:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

确保FileName以Path.DirectorySeparatorChar结尾,这样它就可以明确地指向一个文件夹。(感谢@ binki。)

这个解决方案不能用于打开文件夹并选择其中的项目,因为似乎没有对应的动词。


这对我来说可行,无论是在Windows还是在使用Mono的Linux上。 - Menno Deij - van Rijswijk
3
如果你使用这种方法并且存在诸如 C:\teste.exeC:\teste.cmd 这样的文件夹,资源管理器将会打开那个你没有预期的其他文件夹。为了避免这种情况,你可以在路径末尾加上一个 Path.DirectorySeparatorChar。查看Visual Studio自身也犯同样错误的例子 - binki
鉴于@Scyssion的答案使用了“/select”,你可能会认为你可以使用Verb =“select”,但遗憾的是你不能。无论如何,非常好的答案! - idbrii
1
这对我在.NET Core 3中有效,不像上面被接受的答案。设置Verb =“open”是不必要的。(在Windows中测试,其他操作系统可能有所不同。) - Walt D
请比较 https://dev59.com/s1sW5IYBdhLWcg3wZWfj#35032232。 - JdeBP
显示剩余2条评论

26

如果您想选择文件或文件夹,可以使用以下方法:

Process.Start("explorer.exe", "/select, c:\\teste");

6
将“/select”更改为“/open”即可打开文件夹,而不是只选择它。 - SushiGuy

6
当使用未转义的字符串时,您不需要双反斜杠:
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

5
您正在使用 @ 符号,这可以避免转义反斜杠的需要。
请删除 @ 或将 \\ 替换为 \。

仍然无法打开文件夹.. 只是在任务管理器中启动进程 - Daniel
我没有进一步的建议,我已经能够在Visual C# Express 2008中测试并使其工作。 - Kevin Laity
2
我会说......斑马。你的浏览器有问题,可能是病毒或其他东西引起的。 - R. Martinho Fernandes

4
你应该使用System.Diagnostics.Process.Start()的一个重载函数。这很简单!
如果你不放置要运行的进程的文件名(explorer.exe),系统会将其识别为有效的文件夹路径,并尝试将其附加到已经运行的Explorer进程。在这种情况下,如果文件夹已经打开,Explorer将不会执行任何操作。
如果你放置了进程的文件名(就像你所做的那样),系统将尝试运行该进程的一个新实例,并将第二个字符串作为参数传递。如果字符串是有效的文件夹,则在新建的进程上打开它,否则新进程将不会执行任何操作。
我不知道在任何情况下无效的文件夹路径是如何被处理的。使用System.IO.Directory.Exists()应该足以确保。

1
不要忘记需要附加一个 Path.DirectorySeparatorChar。否则,如果同名文件夹同时存在.cmd.exe或其他后缀的文件,资源管理器将会打开那个文件夹,或者如果这些实际上是可执行文件或脚本,则运行它们而不是打开您预期的文件夹。 - binki

1

你在转义反斜杠,而@符号本来就可以帮你做到这一点。

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
使用重载版本的方法,该方法接受一个ProcessStartInfo实例,并将ProcessWindowStyle属性设置为适合您的值。

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

这段代码在VS2010环境下运行良好,可以正确打开本地文件夹,但是如果将相同的应用程序托管到IIS中并尝试打开,则一定会失败。

1
我刚遇到了这个问题,后来找到了原因。我的原因没有在这里列出,所以任何其他遇到此问题且这些方法都无法解决的人可以看一下。
如果您使用另一个用户运行Visual Studio并尝试使用Process.Start,则它将在该用户的上下文中运行,并且您将无法在屏幕上看到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接