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

问题描述 投票:0回答:5

我有一个 C# 中的 winforms 应用程序,我必须在其中打开某个文件夹。 我用

System.Diagnostics.Process.Start(pathToFolder);

这会导致以下异常:

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

在 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo 开始信息)

在 System.Diagnostics.Process.Start()

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

在 MyApp.openLogFolderToolStripMenuItem_Click(对象发送者,EventArgs e)

我已经检查了以下事项:

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

另一件事是,如果我使用

Process.Start()
打开此文件夹中的文件,它就可以工作。

有人可以给我提示吗?
干杯

编辑 我的目标是在资源管理器中打开该文件夹。

pathToFolder
类似于
H:\Something\App.Name\Log

c# winforms process.start win32exception
5个回答
25
投票

根据 Microsoft Doc's

System.Diagnostics.Process.Start(string)
运行文件或进程(因此不会打开文件夹)。要打开文件夹,此文档页面建议您可以使用
System.Diagnostics.Process.Start(string, string)
执行此操作,其中第一个应该是资源管理器、总指挥官或类似内容的方式,第二个应该是告诉使用的资源管理器要做什么的参数(打开文件夹
pathToFolder
)。

我认为某个系统变量存储了“默认文件夹查看器”的值,但我不知道在哪里。我会尝试去做并稍后返回答案。

希望对您有帮助。


编辑:我做了一些快速挖掘并打开文件夹,以下应该可以解决问题:

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

第一个参数是经典 Windows 资源管理器的路径,第二个参数是文件夹本身的实际路径。 看起来寡妇本身并不保留其他“文件夹查看器”(例如 Total Commander 等)的路径,因此这种方式可能不可行。


23
投票

试试这个:

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

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);

-2
投票

当打开文件的默认行为与打开文件的相对行为之间存在差异时,实际上会发生此错误。 例如,如果您选择了默认应用程序作为 Internet Explorer 打开 .pdf 文件,并且您尝试使用 Process.Start() 方法打开同一文件。您将收到异常,因为根据默认操作,它应该在 Internet Explorer 中打开该文件,而您的应用程序正在尝试使用 Adobe reader 打开它。

要纠正此问题,请将 .pdf 文件的默认应用程序设置为 Adobe Reader,这样您就不会再收到此错误。 您可以通过右键单击该文件,然后选择“默认程序”或“应用程序”来执行此操作。此外,从可用程序列表中选择默认程序或应用程序,然后选择始终使用选定的程序/应用程序打开此类型的文件。

© www.soinside.com 2019 - 2024. All rights reserved.