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);