【问题标题】:Access is denied exception when using Process.Start() to open folder使用 Process.Start() 打开文件夹时访问被拒绝异常
【发布时间】:2016-05-04 01:54:33
【问题描述】:

我在 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(Object sender, EventArgs e)

我已经检查了以下几点:

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

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

谁能给我一个提示?
干杯

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

【问题讨论】:

  • 路径不是可以使用 process.start()... 打开/启动的可执行文件,您是否尝试使用特定路径打开 explorer.exe?
  • 右键单击打开Visual Studio“以管理员身份运行”
  • @Thorarins 是对的。你为什么不告诉我们你到底想归档什么?
  • 不确定大多数评论和回答的人在重申 Process.Start 不会打开文件夹路径时在谈论什么。确实如此。我在一个使用此功能多年的 .NET Framework 应用程序上工作。我在这里是因为我刚刚将应用程序迁移到 .NET Core,现在我收到“访问被拒绝”错误。

标签: c# winforms process.start win32exception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果它是 ASP.NET 的超链接,您可以使用替代方法

    Response.Redirect(url);
    

    【讨论】:

    • 这会将浏览器重定向到不同的 URL。它与在本地机器上启动进程无关。
    【解决方案3】:

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

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

    【讨论】:

    • 这不是真的。没有什么可以阻止您使用与 Windows 下默认选择的程序不同的程序打开文件。想象一下,如果您的 PC 上有“.TXT 文件垄断”会发生什么!
    【解决方案4】:

    我通常用它来打开文件/目录:

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

    如果这不起作用,那可能是权限问题。

    【讨论】:

      【解决方案5】:

      根据 MSDN (https://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx),System.Diagnostics.Process.Start(string) 运行文件或进程(因此不会打开文件夹)。对于打开文件夹,https://msdn.microsoft.com/en-us/library/h6ak8zt5(v=vs.110).aspx 建议您可以使用 System.Diagnostics.Process.Start(string, string)文件夹pathToFolder)。

      我想一些系统变量存储了“默认文件夹查看器”的值,但我不知道在哪里。我会努力争取,稍后再返回答案。

      希望对你有帮助。


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

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

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

      【讨论】:

      • 可以通过简单地调用Process.Start("explorer.exe", pathToFolder);而不是Process.Start(pathToFolder);来解决问题
      【解决方案6】:

      试试这个:

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

      【讨论】:

      • 这是最好的方法!这样做的一个原因是,如果您多次调用它,它不会多次重新打开文件夹并会重用原始窗口
      • 这在打开需要提升权限的目录时效果很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多