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

Posted

技术标签:

【中文标题】Streamwriter 有时会在一行中间切断我的最后几行?【英文标题】:Streamwriter is cutting off my last couple of lines sometimes in the middle of a line? 【发布时间】:2012-09-25 23:58:03 【问题描述】:

这是我的代码。 :

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 行半行。

我不是您可能看到的流式阅读器/写入器专家。

任何想法或建议将不胜感激,因为这让我很生气。我确定是我用错了。

【问题讨论】:

【参考方案1】:

您没有正确使用 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);

【讨论】:

【参考方案2】:

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

我有一个 idea 关于主题,它与您使用 StreamReader 并调用 EndOfStream 两次的事实有关:在 while 循环标题中,还有一个在里面。

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

解决问题:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

@UserSmith,毕竟写过一次,在文件上也丢失了(见我的回答)【参考方案4】:

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

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

好了,应该可以了。

【讨论】:

遇到了这个答案,我基本上有同样的问题。对于我的情况,这有很大帮助。谢谢。【参考方案5】:

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

using(FileStream fileStreamWrite = 
  new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

  using(StreamWriter sw = new StreamWriter(fileStreamWrite))
  
   // .... write everything here
  

【讨论】:

@Tigran - 大多数 Writer 和 Stream 类都有大小有限的内部缓冲区,因此它们会定期将数据提交到底层存储。结果存储了一些数据,但如果不刷新/关闭,最后一个块可能会丢失。

以上是关于Streamwriter 有时会在一行中间切断我的最后几行?的主要内容,如果未能解决你的问题,请参考以下文章

多行 UILabel 有时会完全显示,有时会被切断

收到的 JSON 切断了开头

画布打印 - wpf

c# StreamWriter 应用中,我想每一行中写入两个不同性质的数据,该怎么写呢

StreamWriter.WriteLine()无法正常工作

FileStream读写文件StreamWriter 和 StreamReader