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 строку и половину строки с другим тестовым файлом, с которым я запускаю его.

Я не являюсь экспертом в области потока/записи, который вы, вероятно, можете видеть.

Любые идеи или предложения были бы очень признательны, поскольку это заставляет меня задирать. Я уверен, что это неправильно.

Ответ 1

Вам не хватает Flush/Close или просто using для вашего автора.

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

Ответ 2

Сразу после закрывающей фигурной скобки оператора using сделайте следующее:

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

Там, это должно сделать это.

Ответ 3

Вам нужно Flush ваш StreamWriter. У StreamWriter есть буфер, и он записывает на диск только тогда, когда буфер заполнен. Попытавшись в конце, вы убедитесь, что весь текст в буфере записан на диск.

Ответ 4

В дополнение к другим ответам (используйте using и/или flush/close), скажем, что они на самом деле не отвечают на вопрос: "Почему это может сократить несколько строк".

У меня есть идея по теме, что это связано с тем, что вы используете StreamReader и дважды вызываете EndOfStream: в заголовке цикла while, а другой внутри.

Единственный возможный способ понять, заканчивается ли stream, попробовать, чтобы прочитать некоторые данные из него. Поэтому я подозреваю, что EnfOfStream делает это и дважды читает его, может создать проблему при обработке потока.

Чтобы устранить проблему:

  • Или используйте простой TextReader, считая, что вы читаете текстовый файл (кажется мне)

  • Или измените логику на вызов только один раз, поэтому больше не звоните на Console.WriteLine("eof" + sr.EndOfStream);

  • Или измените свою логику, поэтому не используйте EndOfStream вообще, но читайте строку за строкой, пока строка не будет null.

Ответ 5

Вы не используете 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);