2014-01-30 245 views
1

我只是要合併在一個給定的目錄中的所有文本文件,類似於下面的命令提示符下命令:合併多個文本文件 - StreamWriter不寫入一個文件?

cd $directory 
copy * result.txt 

我已經寫了下面的代碼,它幾乎完成我想要的東西,但它做一些奇怪的事情。當StreamWriter寫入第一個文件(或i = 0)時,它實際上並不寫入任何內容 - 文件大小仍爲0字節,儘管第一個文件大約爲300 KB。但是,其他文件寫入成功執行。

如果我將命令提示符的輸出與來自C#代碼的輸出比較,可以看到缺少大塊文本。此外,命令提示符結果爲1,044 KB,其中C#結果爲700 KB。

string[] txtFiles = Directory.GetFiles(filepath); 
using (StreamWriter writer = new StreamWriter(filepath + "result.txt")) 
{ 
    for (int i = 0; i < txtFiles.Length; i++) 
    { 
     using (StreamReader reader = File.OpenText(txtFiles[i])) 
     { 
      writer.Write(reader.ReadToEnd()); 
     } 
    } 
} 

我使用的StreamWriter/StreamReader不正確?

回答

1

在這裏,希望它可以幫助你。注意:通過從一個流複製到另一個,您可以節省一些內存並大大提高性能。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string filePath = @"C:\Users\FunkyName\Desktop"; 
     string[] txtFiles = Directory.GetFiles(filePath, "*.txt"); 

     using (Stream stream = File.Open(Path.Combine(filePath, "result.txt"), FileMode.OpenOrCreate)) 
     { 
      for (int i = 0; i < txtFiles.Length; i++) 
      { 
       string fileName = txtFiles[i]; 
       try 
       { 
        using (Stream fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read)) 
        { 
         fileStream.CopyTo(stream); 
        } 
       } 
       catch (IOException e) 
       { 
        // Handle file open exception 
       } 
      } 
     } 
    } 
} 
+0

當程序再次運行在同一個目錄中時,FileMode.OpenOrCreate'會再次將所有文件添加到輸出文件。而是使用'FileMode.Create'來完全覆蓋它或'FileMode.CreateNew'來獲取它已經存在的異常。 – Herdo

+0

@Herdo該程序在運行之前刪除與'filePath'變量匹配​​的所有現有文件夾,因此該實現應該是可以的。謝謝! – TimeBomb006

1

簡約執行,讀取字節,寫他們,而不是使用流閱讀 - 請注意,你應該正確處理IOException異常,以避免不當行爲:

var newline = Encoding.ASCII.GetBytes(Environment.NewLine); 
var files = Directory.GetFiles(filepath); 
try 
{ 
    using (var writer = File.Open(Path.Combine(filepath, "result.txt"), FileMode.Create)) 
     foreach (var text in files.Select(File.ReadAllBytes)) 
     { 
      writer.Write(text, 0, text.Length); 
      writer.Write(newline, 0, newline.Length); 
     } 
} 
catch (IOException) 
{ 
    // File might be used by different process or you have insufficient permissions 
} 
0

我寫你的代碼,它正常工作!只有改變行:

using (StreamWriter writer = new StreamWriter(filepath + "result.txt")) 

到:

using (StreamWriter writer = new StreamWriter(filepath + "/result.txt")) 

我猜你看不到的文件,因爲它被保存在另一個文件夾。

相關問題