Как обрабатывать данные из Process.StandardOutput, когда данные около 400 МБ - PullRequest
1 голос
/ 27 сентября 2011

Я пытаюсь получить список файлов с сервера с помощью команды windows - «DIR / S / B». Вывод огромен (около 400 МБ).Теперь, когда я попытался получить его с помощью подхода ниже, его обработка заняла несколько часов.Есть ли более быстрый способ сделать это.

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();

Ответы [ 3 ]

7 голосов
/ 27 сентября 2011

Почему бы не использовать DirectoryInfo.GetFiles?

Я полагаю, что теперь довольно много времени уходит на выполнение выполняемой команды, а не кода .NET.dir потребуется много времени, чтобы последовательно записать столько данных в поток.Затем вы используете String.Split, который также захлебнется таким большим количеством данных.

Используя DirectoryInfo.GetFiles, вы сможете получить все имена файлов в одной строке (и вы также можете получить другиеинформация о файлах следующим образом):

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

Если вас действительно интересуют только имена файлов, вы можете использовать:

var fileNames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
1 голос
/ 27 сентября 2011

Ты изобретаешь колесо.Добавьте ссылку на System.IO и используйте классы DirectoryInfo и FileInfo.

0 голосов
/ 27 сентября 2011

Когда вы говорите «получить», вы просто имеете в виду список файлов в каталоге?

Если это так, не можете ли вы использовать метод 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

...