1

我正在尝试使用 windows 命令从服务器检索文件列表 - “DIR /S/B” 输出很大(大约 400 MB)。现在,当我尝试使用以下方法检索它时,需要花费数小时来处理。有没有更快的方法来做到这一点。

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.Splitwhich 也会扼杀那么多数据。

通过使用 DirectoryInfo.GetFiles,您应该能够在一行中获取所有文件名(您还可以通过这种方式获取有关文件的其他信息):

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 回答