使用Process.Start打开一个文件夹


148

我看到了另一个主题,但我遇到了另一个问题。该过程正在启动(在任务管理器中看到),但是文件夹未在我的屏幕上打开。怎么了?

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

您确定您的路径正确吗?
内森·库普

1
为什么要手动调用资源管理器?为什么不只打开文件夹,即使用UseShellExecute设置为true并将Verb设置为“ open”的ProcessStartInfo调用Process.Start?
OregonGhost

1
是的,我尝试在没有路径的情况下打开“ explorer.exe”,但也无济于事。
丹尼尔(Daniel)2009年

好吧,我没有发布,因为问题不是如何打开文件夹,而是如何运行explorer.exe打开文件夹。我只是想知道为什么首先要直接调用资源管理器,因为可能有一个原因;)
OregonGhost

我只想在这里排除选项,所以这可能是一个愚蠢的问题:您不是在Linux中使用mono来执行此操作,对吗?我们说的是Windows环境吗?
FredrikMörk,2009年

Answers:


266

您确定文件夹“ c:\teste”存在吗?如果没有,资源管理器将打开并显示一些默认文件夹(在我的情况下为“ 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”,然后按Enter
  • 打开命令提示符,键入“ explorer.exe”,然后按Enter

好吧,我敢肯定,如果它不存在,会以相同的方式打开任何文件夹吗?
丹尼尔(Daniel)

好吧,那可能是环境问题..我通过cmd打开explorer.exe并正常打开..除了'Process.Start(@“ c:\ does_not_exist”);'之外,所有Processs.Start均不起作用。引发了异常
Daniel Daniel

1
如果该资源管理器窗口已经打开,则差别很小:Process.Start(path) 激活该窗口(可能仅在任务栏中闪烁,而不显示在最前面);explorer.exe+ parameter总是在前面打开一个新窗口(但同一窗口多次)。因此,两者都有警告。
2013年

Process.Start(@"c:\temp")必须谨慎使用。如果c:\temp.com存在,则函数调用将打开c:\temp.com。有关更多详细信息,请参见forums.iis.net/p/1239773/2144186.aspx
Lex Li

请注意,Process.Start(@"c:\temp")容易打开其他文件夹,例如C:\temp.exeC:\temp.cmd在VS本身表现出错误的行为的情况下,请参见此问题。您可以通过使用explorer.exe变体或(最好是IMO)始终添加来避免这种情况Path.DirectorySeparatorChar。例如,Process.Start(@"C:\temp\")
宾基

46

出于完整性考虑,如果您只想打开一个文件夹,请使用以下命令:

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,2016年

1
如果您使用此方法,并且一个文件夹(例如C:\teste.exeC:\teste.cmd存在),Explorer将打开该其他文件夹,而不是您想要的文件夹。为避免这种情况,您可以将a附加Path.DirectorySeparatorChar到路径中。见VS本身如何犯同样的错误
宾基

给定@Scyssion使用“ / select”的答案,您认为可以使用Verb = "select",但是您不能使用。无论如何,很好的答案!
idbrii

1
与上面接受的答案不同,它在.NET Core 3中对我有效。Verb = "open"不需要设置。(在Windows中测试,其他操作系统可能有所不同。)
Walt D

您可以从(docs.microsoft.com/en-us/dotnet/api/….Verbs上的属性中获取适用的动词ProcessStartInfo
GaryNg,

16

如果要选择文件或文件夹,可以使用以下命令:

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

2
要打开文件夹而不是选择文件夹,只需更改/select/open
SushiGuy

5

您正在使用@符号,这消除了转义反斜杠的需要。

删除@或用\替换\\


仍然没有打开文件夹..仅启动进程@任务管理器
Daniel

我没有其他建议,我能够在Visual C#express 2008中进行测试并使其正常工作
Kevin Laity

1
我会说...斑马。您的资源管理器中有问题,可能是virii或某物...
R. Martinho Fernandes

4

使用未转义的字符串时,您不需要双反斜杠:

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

3

您应该使用 System.Diagnostics.Process.Start()重载之一。很简单!

如果您没有放置要运行的进程的文件名(explorer.exe),则系统会将其识别为有效的文件夹路径,并尝试将其附加到已经运行的Explorer进程中。在这种情况下,如果文件夹已经打开,资源管理器将不执行任何操作。

如果您放置流程的文件名(如您所做的那样),系统将尝试运行流程的新实例,并将第二个字符串作为参数传递。如果字符串是有效文件夹,则在新创建的进程上将其打开,否则,新进程将不执行任何操作。

我不知道在任何情况下该进程如何处理无效的文件夹路径。使用System.IO.Directory.Exists()应该足以确保这一点。


别忘了您需要附加一个Path.DirectorySeparatorChar。否则,如果还存在一个具有相同名称但.cmd.exe可能带有其他后缀的文件夹,Explorer将打开该其他文件夹;或者,如果这些文件夹实际上是可执行文件或脚本,它将运行它们而不是按预期方式打开该文件夹。
宾基


1

当at符号为您这样做时,您就在转义反斜杠。

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

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

此代码在VS2010环境中可以正常工作,并且可以正确打开本地文件夹,但是如果您在IIS中托管相同的应用程序并尝试打开,则肯定会失败。


1

香港专业教育学院只是有这个问题,我找出原因。我的原因未在此处列出,因此其他任何遇到此问题的人都无法解决。

如果您以其他用户身份运行Visual Studio并尝试使用Process.Start,它将在该用户上下文中运行,并且您不会在屏幕上看到它。


0

奇怪。

如果找不到explorer.exe,您应该得到一个例外。如果找不到该文件夹​​,它仍应打开一些文件夹(例如我的文档)

您说浏览器的另一个副本出现在任务管理器中,但看不到它。

是否有可能打开屏幕外(即另一台显示器)?

还是您有机会在非交互式服务中执行此操作?


我只有1个监视器,并且“您说任务管理器中出现了另一个资源管理器副本,但您看不到它。” 这是正确的..我不知道您的意思是“还是您有机会在非交互式服务中执行此操作?”
丹尼尔(Daniel)

我的意思是,如果您正在编写的程序是一种服务(默认情况下完全在后台运行),而不是普通的winforms程序。(如果您不知道什么是服务,则不太可能编写一个服务)。回到任务管理器,如果您在此隐藏的资源管理器窗口中选择“切换到”,“移到最前”或“最大化”,它会出现吗?
sgmoore

0

从开始菜单运行“ explorer.exe c:\ teste”时,它是否可以正确打开?您尝试了多久了?当我的计算机上有很多进程并且打开一个新进程(设置为IE)时,我会看到类似的行为。它在任务管理器中启动,但未在前端显示。您是否尝试过重启?

以下代码应打开一个新的资源管理器实例

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

尝试此操作时,您是否正在运行许多应用程序?有时我在工作中遇到奇怪的行为,因为我打开了太多窗口(我的应用程序大量使用),因此我的系统用尽了GDI句柄。

发生这种情况时,直到我关闭某些东西以释放一些GDI手柄,窗口和上下文菜单才会出现。

XP和Vista中的默认限制为10000。我的DevStudio具有1500个GDI句柄并不罕见,因此,如果您打开了几个Dev Studio副本,它会很快耗尽它们。您可以在TaskManager中添加一列,以查看每个进程正在使用多少个句柄。

您可以执行注册表调整来增加限制。

有关更多信息,请参见http://msdn.microsoft.com/zh-cn/library/ms724291(VS.85).aspx


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.