16

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

System.Diagnostics.Process.Start(pathToFolder);

这会导致以下异常:

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

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

在 System.Diagnostics.Process.Start()

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

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

我已经检查了以下内容:

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

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

谁能给我一个提示?
干杯

编辑 我的目标是在资源管理器中打开文件夹。有点pathToFolderH:\Something\App.Name\Log

4

6 回答 6

16

根据 MSDN(https://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspxSystem.Diagnostics.Process.Start(string)运行文件或进程(因此不打开文件夹)。为了打开文件夹, https: //msdn.microsoft.com/en-us/library/h6ak8zt5(v= vs.110).aspx 建议您可以使用System.Diagnostics.Process.Start(string, string)where first should be a way to explorer, Total commands或类似的东西,第二个应该是一个参数,告诉使用的资源管理器做什么(打开文件夹pathToFolder)。

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

希望它有所帮助。


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

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

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

于 2016-01-27T08:22:48.583 回答
14

尝试这个:

var psi = new System.Diagnostics.ProcessStartInfo() { FileName = pathToFolder, UseShellExecute = true };
System.Diagnostics.Process.Start(psi);
于 2016-01-27T08:32:30.793 回答
1

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

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

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

于 2016-01-27T08:39:57.307 回答
0

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

var startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = //working directory 
Process proc = Process.Start(startInfo);
于 2016-01-27T08:28:37.347 回答
-2

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

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

于 2017-07-24T10:10:12.423 回答
-3

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

Response.Redirect(url);
于 2020-06-16T16:58:35.997 回答