C# Process.Start():系统找不到指定的文件,但我的文件路径似乎是合法的

C# Process.Start():系统找不到指定的文件,但我的文件路径似乎是合法的,c#,process,diagnostics,du,C#,Process,Diagnostics,Du,这让我难以置信。使用以下代码: Process du = new Process(); string cmdPath = System.IO.Path.Combine(Environment.SystemDirectory, "du.exe"); Debug.WriteLine(cmdPath); ProcessStartInfo info = new ProcessStartInfo(cmdPath); info.CreateNoWindow = true; info

这让我难以置信。使用以下代码:

Process du = new Process();          

string cmdPath = System.IO.Path.Combine(Environment.SystemDirectory, "du.exe");
Debug.WriteLine(cmdPath);

ProcessStartInfo info = new ProcessStartInfo(cmdPath);
info.CreateNoWindow = true;

info.Arguments = arguments;            
info.UseShellExecute = false;

info.RedirectStandardOutput = true;
du.StartInfo = info;
du.EnableRaisingEvents = true;
du.OutputDataReceived += responseParser;

du.Start();
du.BeginOutputReadLine();
du.WaitForExit();
我运行它,我得到:

未处理的异常:System.ComponentModel.Win32Exception:系统找不到指定的文件

尽管cmdPath的输出值是
C:\Windows\system32\du.exe

当然,如果我只是在命令提示符中键入
cmdPath
的内容,它会运行du.exe并提供用法信息

另外,如果我将命令路径替换为“du.exe”,并将du.exe放在工作目录中,则一切正常。但我想引用系统位置中的那个

那么,到底发生了什么?据我所知,我有一个合法的文件说明符,但为什么不执行它呢?这段基本代码还执行其他几个程序并获得它们的输出。其他的都可以正常工作,尽管du.exe与它们不同,它位于system32目录中。这与此有关吗

谢谢

这取决于你的工作。您将在64位计算机上运行32位进程。这意味着
C:\Windows\system32
被透明地重定向到
C:\Windows\SysWOW64
,我希望在那里找不到
du.exe
。如果改用
C:\Windows\Sysnative
,则可以找到该文件


但是,我怀疑您已将
du.exe
添加到系统目录,因为这不是标准的Windows组件。你不应该那样做。我建议您将文件放在其他地方,因为您不应该在系统目录中写入。

我在发布问题和回答之间找到了答案。du.exe是一个32位可执行文件,未正确地放入system32而不是SysWow64。因此,当32位程序查找它时,它没有注意到它,因为du.exe位于错误的位置。但您根本不应该将它放在系统目录中。这是为系统保留的。我相信您可以为您的unix工具集找到一个更好的位置。它实际上是sysdu。我同意它不应该在那里,但它在几台机器上,所以现在我必须处理它。它仍然是一个FWIW。不管怎样,看来你又回到了正轨!