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 を配置すると、すべて正常に動作します。しかし、システムの場所にあるものを参照したい。

それで、何が起こっているのですか?私の知る限り、正当なファイル指定子がありますが、なぜそれをProcess.Start()実行しないのでしょうか? この基本的なコードは、他のいくつかのプログラムも実行しており、それらの出力を取得しています。du.exeはsystem32ディレクトリにあるという点で異なりますが、他のすべては正常に動作します。それはそれと何か関係がありますか?

ありがとう

4

1 に答える 1

15

これは、ファイル システム リダイレクタにまで及びます。64 ビット マシンで 32 ビット プロセスを実行します。つまり、C:\Windows\system32透過的にリダイレクトされ、そこに見つからないことがC:\Windows\SysWOW64予想されます。du.exe代わりに使用するC:\Windows\Sysnativeと、ファイルを見つけることができます。

du.exeただし、これは標準の Windows コンポーネントではないため、システム ディレクトリに追加したと思われます。あなたはそれをすべきではありません。システムディレクトリに書き込むべきではないため、ファイルを別の場所に置くことをお勧めします。

于 2012-04-27T23:44:39.797 に答える