2014-01-26 82 views
1

每次如何將f附加到列表中,然後將列表寫入文本文件?我試着用下面的代碼,但文本文件總是空的?如何將列表<String>寫入文本文件?

static void DirSearch(string dir, string pattern) 
    { 
     try 
     { 
      List<String> filesList = new List<string>(); 

      foreach (string f in Directory.GetFiles(dir, pattern)) 
      //Console.WriteLine(f); 
      { 
       // Console.WriteLine(f); // // <- This works correctly 
       filesList.Add(f); 
      } 
      foreach (string d in Directory.GetDirectories(dir)) 
      { 
       //Console.WriteLine(d); 
       DirSearch(d, pattern); 
      } 

      File.WriteAllLines("files.txt", filesList.ToArray()); 

     } 
     catch (System.Exception ex) 
     { 
      //Console.WriteLine(ex.Message); 
     } 
    } 
+3

您需要在遞歸調用中傳遞filesList。 –

回答

3

我懷疑的問題是,對DirSearch每次調用,你覆蓋從以前調用輸出的文件。如果最後的調用沒有文件(只有目錄),你最終會得到一個空文件。

選項:

  • 使用Directory.GetFiles(dir, pattern, SearchOption.AllDirectories,這樣你就不需要使用遞歸的。
  • 使用File.AppendAllLines而不是File.WriteAllLines
  • 完全建立起來就行存儲器(遞歸),只有在非常結束通話File.WriteAllLines

後一種方法會是這個樣子:

public static DirSearch(string dir, string pattern) 
{ 
    List<string> files = new List<string>(); 
    DirSearchImpl(dir, pattern, files); 
    File.WriteAllLines("files.txt", files); 
} 

private static DirSearchImpl(string dir, string pattern, List<string> files) 
{ 
    // Simpler than your previous loop... 
    files.AddRange(Directory.GetFiles(dir, pattern)); 
    foreach (var subdirectory in Directory.GetDirectories(dir)) 
    { 
     DirSearchImpl(subdirectory, pattern, files); 
    } 
} 

我也建議改變你的異常處理 - 捕Exception很少是好主意,我不知道你真的想如果事情失敗繼續下去,是嗎?

+0

如果訪問被拒絕某個文件夾,您的代碼會失敗?而且這總是我猜想,無論如何,我可以忽略並恢復在訪問被拒絕的情況下搜索? –

+0

@ShikataGaNai:在這種情況下,你應該*發現一個異常 - 但可能是一個特定的異常,而不僅僅是'Exception'。哪個調用拋出異常?我不會期望它會一直髮生 - 如果你使用'c:\'這是相當可能的,但是在你的用戶文件夾下的某個地方(例如'Documents'),它似乎不太可能。 –

+0

是的,我使用「C:\\」 –