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

Access is denied exception when using Process.Start() to open folder

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

System.Diagnostics.Process.Start(pathToFolder);

这会导致以下异常:

System.ComponentModel.Win32Exception (0x80004005): Access is denied

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() 打开此文件夹中的文件,它会起作用。

任何人都可以给我提示吗?
干杯

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

根据 MSDN(https://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx) the System.Diagnostics.Process.Start(string) runs the file or process (and therefore does not open the folder). For opening a folder, the https://msdn.microsoft.com/en-us/library/h6ak8zt5(v=vs.110).aspx 建议您可以使用 System.Diagnostics.Process.Start(string, string) 执行此操作,其中第一个应该是探索者、Total commander 或类似东西的方法,第二个应该是一个参数告诉使用资源管理器要做什么(打开文件夹 pathToFolder)。

我想某些系统变量存储了 "default folder viewer" 的值,但我不知道在哪里。我会尝试去做,return 稍后会给出答案。

希望对您有所帮助。


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

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

其中第一个参数是经典 windows 资源管理器的路径,第二个是文件夹本身的实际路径。 似乎寡妇本身并没有通往其他 "folder viewer" 的路径(例如 Total Commander 等),所以这种方式可能不在 table.

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

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

试试这个:

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

我一般用这个打开file/directory:

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

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

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

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

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

Response.Redirect(url);