16

这是我的代码。:

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

我不是您可能会看到的流媒体阅读器/作家专家。

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

4

5 回答 5

23

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

using(FileStream fileStreamWrite = 
  new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
{
  using(StreamWriter sw = new StreamWriter(fileStreamWrite))
  {
   // .... write everything here
  }
}
于 2012-10-04T21:06:42.063 回答
9

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

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

在那里,应该这样做。

于 2012-10-04T21:08:36.517 回答
3

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

于 2012-10-04T21:06:12.037 回答
2

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

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

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

要解决问题:

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

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

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

于 2012-10-04T21:22:45.557 回答
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);
于 2012-10-04T21:34:37.830 回答