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

3

这让我感到困惑。使用以下代码:

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。 那么,出了什么问题?据我所知,我有一个合法的文件说明符,但为什么Process.Start()无法执行它?这段基本代码还执行了几个其他程序并获取其输出。其他程序都能正常工作,尽管du.exe与它们不同,因为它位于system32目录中。这是否与问题有关?谢谢。
1个回答

16
这是由于文件系统重定向器引起的。您将在64位机器上运行32位进程。这意味着C:\Windows\system32会被透明地重定向到C:\Windows\SysWOW64,因此我预计无法在那里找到du.exe。如果您改用C:\Windows\Sysnative,则可以找到该文件。
但是,我怀疑您已将du.exe添加到了系统目录中,因为这不是标准的 Windows 组件。您不应该这样做,我建议您将文件放在其他位置,因为您不应该在系统目录中编写文件。

在我发问题和你回答之间,我已经解决了。du.exe是一个32位可执行文件,错误地放置在system32而不是SysWow64中。因此,当32位程序寻找它时,由于du.exe在错误的位置,它未能注意到它。 - whatsisname
1
但是你不应该把它放在系统目录中,那是为系统保留的。我相信你可以找到一个更好的地方来存放你的Unix工具集。 - David Heffernan
实际上这是 SysInternals du。我同意它不应该在那里,但它现在出现在几台机器上,所以我必须处理它。 - whatsisname
顺便提一下,它仍然是一个Unix工具。无论如何,看起来你又回到了正轨! - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接