1

Windowsコマンド-"DIR/S / B"を使用してサーバーからファイルのリストを取得しようとしています。出力は膨大です(約400MB)。以下のアプローチで取得しようとすると、処理に数時間かかります。それを行うためのより速い方法はありますか?

string path = args[0];
var start = DateTime.Now;

System.Diagnostics.ProcessStartInfo procStartInfo =
    new System.Diagnostics.ProcessStartInfo("cmd", "/c " + "dir /s/b " + path );
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();

//string [] result = proc.StandardOutput.ReadToEnd().Split('\n'); ;

StreamWriter writer = new StreamWriter("FileList.lst");
while (proc.StandardOutput.EndOfStream != true)
{
    writer.WriteLine(proc.StandardOutput.ReadLine());
    writer.Flush();
}
writer.Close();
4

3 に答える 3

7

使ってみませんDirectoryInfo.GetFilesか?

.NETコードではなく、実行中のコマンドにかなりの時間が費やされていると思います。dirその量のデータを順番にストリームに書き込むには、長い時間がかかります。次に、String.Splitこれを使用すると、その量のデータが詰まります。

DirectoryInfo.GetFilesを使用すると、すべてのファイル名を1行で取得できるはずです(この方法でファイルに関するその他の情報を取得することもできます)。

var files = (new DirectoryInfo(path)
                .GetFiles("*.*", SearchOption.AllDirectories)
                .Select(fi => fi.Name);

本当にファイル名だけが気になる場合は、次を使用できます。

var fileNames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
于 2011-09-27T14:10:03.490 に答える
1

あなたは車輪の再発明をしています。System.IOへの参照を追加し、DirectoryInfoクラスとFileInfoクラスを使用します。

于 2011-09-27T14:11:07.237 に答える
0

あなたが受け取ると言うとき、あなたは単にディレクトリ内のファイルをリストすることを意味しますか?

その場合、Directory.GetFiles()メソッドを使用できませんか?

        // Only get files that begin with the letter "c."
        string[] dirs = Directory.GetFiles(@"c:\", "c*");
        Console.WriteLine("The number of files starting with c is {0}.", dirs.Length);
        foreach (string dir in dirs) 
        {
            Console.WriteLine(dir);
        }

MSDNから

于 2011-09-27T14:12:57.060 に答える