使用Process.Start()打开文件夹时遇到访问被拒绝异常

24

我有一个用C#编写的winforms应用程序,我需要打开一个特定的文件夹。 我使用

System.Diagnostics.Process.Start(pathToFolder);

这导致了以下异常:

System.ComponentModel.Win32Exception (0x80004005):访问被拒绝

at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)

at System.Diagnostics.Process.Start()

at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)

at MyApp.openLogFolderToolStripMenuItem_Click(Object sender, EventArgs e)

我已经检查了以下内容:

  • 文件夹存在
  • 用户有文件夹的权限(可以在资源管理器中打开)

另一件事是,如果我使用Process.Start()来打开此文件夹中的文件,则可以正常工作。

有人能给我一个提示吗?
Cheers

编辑 我的目标是在资源管理器中打开文件夹。 pathToFolder类似于H:\Something\App.Name\Log


1
路径不是可执行文件,您不能使用process.start()打开/启动它... 您是想使用特定路径打开explorer.exe吗? - Thorarins
通过右键单击以管理员身份运行,打开Visual Studio。 - Jaydip Jadhav
@Thorarins 是正确的。为什么不告诉我们你想要实现什么? - Pikoh
4
不确定大多数评论和回答者重申Process.Start无法打开文件夹路径时在谈论什么。它可以。我在一个使用了这个功能多年的.NET Framework应用程序上工作。我来这里是因为我刚刚将应用程序迁移到了.NET Core,现在我遇到了“访问被拒绝”的错误。 - William
@William 确认。在.NET Framework中,使用Process.Start(directory)足以解决问题。但在.NET Core中会出现错误。 - undefined
6个回答

25
根据Microsoft Doc'sSystem.Diagnostics.Process.Start(string)运行文件或进程(因此不会打开文件夹)。要打开文件夹,this doc page建议使用System.Diagnostics.Process.Start(string, string),其中第一个参数应该是资源管理器、总指挥或类似的方式,第二个参数应该是告诉所使用的浏览器要做什么的参数(打开文件夹pathToFolder)。
我猜想某些系统变量存储了“默认文件夹查看器”的值,但我不知道在哪里。我将尝试找到它,并稍后返回答案。
希望这有所帮助。

编辑:我进行了一些快速搜索,打开文件夹的方法如下:

System.Diagnostics.Process.Start(Environment.GetEnvironmentVariable("WINDIR") +
    @"\explorer.exe", pathToFolder);

第一个参数是指经典的Windows资源管理器路径,第二个参数是文件夹实际路径。似乎Windows本身不保存其他“文件夹查看器”的路径(如Total Commander等),因此这种方法可能行不通。


8
只需调用 Process.Start("explorer.exe", pathToFolder); 而不是 Process.Start(pathToFolder); 即可解决问题。 - IRAndreas

22

试一下这个:

var psi = new System.Diagnostics.ProcessStartInfo() { FileName = pathToFolder, UseShellExecute = true };
System.Diagnostics.Process.Start(psi);

这是最好的方法!其中一个原因是,如果您多次调用它,它不会多次重新打开文件夹,并将重复使用原始窗口。 - Raj Rao
当打开需要高级权限的目录时,这很有效。 - Brien King

2

我通常使用以下内容来打开文件/目录:

    public static void OpenFile(string path, bool isDirectory = false)
    {
        if (string.IsNullOrEmpty(path)) return;
        if ((isDirectory && Directory.Exists(path)) || (!isDirectory && File.Exists(path)))
        {
            ProcessStartInfo pi = new ProcessStartInfo(path);
            pi.Arguments = Path.GetFileName(path);
            pi.UseShellExecute = true;
            pi.WindowStyle = ProcessWindowStyle.Normal;
            pi.Verb = "OPEN";

            Process proc = new Process();
            proc.StartInfo = pi;

            proc.Start();
        }
    } 

或者

Process.Start("explorer.exe",path);

如果这样行不通,那么可能是权限问题。

0

你可以像这样设置工作目录,但你不能运行目录本身,只能运行其中的文件或exe。

var startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = //working directory 
Process proc = Process.Start(startInfo);

0
非常重要的是在开始进程之前设置工作目录。
Directory.SetCurrentDirectory("BackUp");
Process.Start("BackUp/MyApp.exe");

如果你不这样做,BackUp/MyApp.exe将会认为当前目录是你从中运行Process.Start("BackUp/MyApp.exe")的目录。这可能会导致上述问题,如果你启动的进程中的代码试图在错误的文件夹中执行某些操作。

-2

当打开文件的默认行为和相对行为不同时,就会出现这个错误。例如,如果您选择将打开.pdf文件的默认应用程序设置为Internet Explorer,并且您正在尝试使用Process.Start()方法打开同一文件,则会收到异常,因为根据默认操作,它应该在Internet Explorer中打开该文件,而您的应用程序正在尝试使用Adobe Reader打开文件。

要纠正此问题,请将.pdf文件的默认应用程序设置为Adobe Reader,您将不再收到此错误。您可以右键单击文件,然后选择“默认程序或应用程序”来完成此操作。进一步选择可用程序列表中的默认程序或应用程序,然后选择“始终使用所选程序/应用程序打开此类文件”。


1
这不是真的。没有什么能阻止你使用不同于在Windows下选择为默认程序的程序打开文件。想象一下,如果在你的电脑上有一个“.TXT文件垄断”会发生什么! - Heinz Kessler

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