Streamwriter有时会在一条线的中间切断我的最后几行?

这是我的代码。 :

FileStream fileStreamRead = new FileStream(pathAndFileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None); FileStream fileStreamWrite = new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); StreamWriter sw = new StreamWriter(fileStreamWrite); int readIndex = 0; using (StreamReader sr = new StreamReader(fileStreamRead)) { while (!sr.EndOfStream) { Console.WriteLine("eof" + sr.EndOfStream); readIndex++; Console.WriteLine(readIndex); string currentRecord = ""; currentRecord = sr.ReadLine(); if (currentRecord.Trim() != "") { Console.WriteLine("Writing " + readIndex); sw.WriteLine(currentRecord); } else { Console.WriteLine("*******************************************spaces ***********************"); } } 

它使用一个测试文件和半行来切断2行,然后使用另一个测试文件对齐1行和半行。

我不是你可能看到的流读者/作家专家。

任何想法或建议将不胜感激,因为这会让我感到沮丧。 我确信这是我错误地使用这些。

您缺少Flush / Close或只是为您的作家使用。

 using(FileStream fileStreamWrite = new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); { using(StreamWriter sw = new StreamWriter(fileStreamWrite)) { // .... write everything here } } 

using语句的右括号之后,执行以下操作:

 sw.Flush(); sw.Close(); 

在那里,应该这样做。

你需要Flush你的StreamWriter 。 StreamWriter有一个缓冲区,只有当缓冲区已满时才会写入磁盘。 通过最后刷新,确保缓冲区中的所有文本都写入磁盘。

除了其他答案(使用和/或flush/close )之外,还会说他们实际上没有回答这个问题:“为什么它可能会削减几行。”

我有一个关于主题的想法 ,它与你使用StreamReader并调用EndOfStream 两次的事实有关:在while循环头中,另一个在其中。

了解stream结束的唯一可能方法是尝试从中读取一些数据。 所以我怀疑EnfOfStream这样做,并且读取它两次,可能会在流处理中产生问题。

要解决问题:

  • 或者使用简单的TextReader ,考虑到你正在阅读文本文件(在我看来)

  • 或者将您的逻辑更改为仅调用一次,因此不再调用Console.WriteLine("eof" + sr.EndOfStream);

  • 或者改变你的逻辑,所以根本不要使用EndOFStream ,而是逐行读取直到该行为null

您没有正确使用StreamWriter。 此外,由于你总是阅读线条,我会使用一种方法,已经为你做了所有这些(并妥善管理)。

 using (var writer = new StreamWriter("path")) { foreach(var line in File.ReadLines("path")) { if (string.IsNullOrWhiteSpace(line)) { /**/ } else { /**/ } } } 

… 要么 …

 /* do not call .ToArray or something that will evaluate this _here_, let WriteAllLines do that */ var lines = File.ReadLines("path") .Select(line => string.IsNullOrWhiteSpace(line) ? Stars : line); var encoding = Encoding.ASCII; // whatever is appropriate for you. File.WriteAllLines("path", lines, encoding);