2017-09-18 4 views
-1

C#、ファイル、およびフォルダのネットワークドライブを介してフォルダの内容を最適化するためにいくつかの作業を行っています。ファイルの場合は、NameとDateModifiedだけのフォルダに対して、FileName、File Size、DateModifiedが必要です。シェル(DIR)を使用した高速ディレクトリ一覧

StackOverflowでさまざまなソリューションを検索し、Directory.GetFilesを使用して解決しましたが、ファイルを並行処理していないため、EnumerateFilesを使用する利点はありません。

4000および5個のサブフォルダを持つWAN上のテストケースでは、GetFilesは30秒以上かかることがありますが、Windowsでは2秒でそのフォルダをDIRできます。

私はあまりにも多くのWindows APIコードに入りたいとは思わないので、DIRコマンドをシェルに入れ、標準出力をリダイレクトして入力を解析するのが良い中間地だと思った。可愛いわけではありませんが、OKです。私は私が望むものをほとんどありません。このコードを見つけました:

Process process = new Process(); 
process.StartInfo.FileName = "ipconfig.exe";   
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true;   
process.Start(); 

// Synchronously read the standard output of the spawned process. 
StreamReader reader = process.StandardOutput; 
string output = reader.ReadToEnd(); 

これは、IPCONFIG.EXEのため正常に動作しますが、DIRはexeファイルではありませんので、私はそれを呼び出すかもしれない方法任意のアイデア?私はこのような何かリダイレクトしたい:

DIRを「\ MyNasDrive \ MyFolderという」

最悪の場合、私は.batファイルでこれを包むことができ、それはかなり恐ろしい感じています。

感謝しています。

==は私自身の解決策を見つけたが、あなたはそれに何かを見ることができるなら、私は

string DirPath = "\\\\MYServer\\MyShare\\"; 

Process process = new Process(); 
process.StartInfo.FileName = "C:\\Windows\\System32\\cmd.exe"; 
process.StartInfo.Arguments = "/C DIR /-C \"" + DirPath + "\""; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
process.StartInfo.CreateNoWindow = true; 
process.Start(); 

// Synchronously read the standard output of the spawned process. Note we aren't reading the standard err, as reading both 
// Syncronously can cause deadlocks. https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.110).aspx 
//if we need to do this in the future then might be able to use https://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=vs.110).aspx 
StreamReader reader = process.StandardOutput; 
string output = reader.ReadToEnd(); 

process.WaitForExit(); 
process.Close(); 
+0

'EnumerateFilesの使用には何のメリットもありません。' 'GetFiles'の代わりに' EnumerateFiles'を使用したときにどれくらいの時間がかかりましたか? – mjwills

+0

EnumerateFileを使用してコードを実行すると、同じ速度で実行されたため、EnumerateFile呼び出しの直後にすべての値を読み取るループが必要でした。私のコードはすべての値を読み取ることなく進めることができないので、なぜスピードの優位性はないと思いますか? 明らかにファイルをロードしていたら、それを並列化できますが、ファイル名、サイズ、およびDateModifiedを読み込んでいます。 –

答えて

0

DIRが

cmd.exeがあるexeファイルではありません==お知らせくださいEXE。 2つのパラメータを持つ

コールcmd.exe

  • /C
  • dir

注:またtrueにあるUseShellExecuteを設定することができます。

関連する問題