2011-09-27 43 views
1

我試圖從服務器檢索文件列表與Windows命令 - 「DIR/S/B」 輸出是巨大的400 MB)。現在,當我嘗試用以下方法檢索它時,需要花費幾個小時來處理。有沒有更快的方法來做到這一點。C# - 如何處理來自Process.StandardOutput數據大約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(); 

回答

7

爲什麼不使用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); 
+0

我試過DirectoryInfo的方法,但它未能得到一些在windows目錄下的文件夾中。它給出了一個例外..拒絕訪問文件/文件夾。而DIR運行平穩的文件/文件夾。 –

+0

@MayurJ我以前有過這個問題,這裏是我發佈的問題,也許答案會幫助你這個http://stackoverflow.com/questions/6762101/c-file-permission-exclusion –

+0

在.Net 4.0或更高版本,推薦使用EnumerateFiles而不是GetFiles,因爲GetFiles在整個數組填滿之前不會返回,而使用EnumerateFiles則可以立即開始迭代文件。 –

1

你正在重新發明輪子。添加對System.IO的引用並使用DirectoryInfo和FileInfo類。

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

+0

我想列出目錄和子目錄中的所有文件,而不會爲syatem文件夾獲取拒絕訪問異常。就像windows DIR命令一樣。 (嘗試給c:\ windows \ system32作爲目錄,你會得到訪問被拒絕的錯誤) –