Пожалуйста, рассмотрите этот сценарий:
Я хочу прочитать файл, затем поместить его байты в MemoryStream
, затем записать в него несколько строк и сразу же прочитать MemotyStream
целиком. Например, у меня есть текстовый файл, содержащий строку test
. Я написал этот код:
var allBytes = File.ReadAllBytes(<filePath>);
MemoryStream _mem = new MemoryStream(0);
_mem.Write(allBytes, 0, allBytes.Length);
StreamWriter sw = new StreamWriter(_mem);
sw.WriteLine("This is some text");
_mem.Position = 0;
using (StreamReader sr = new StreamReader(_mem))
{
while (sr.Peek() >= 0)
{
Console.Write((char)sr.Read());
}
}
после того, как я запустил этот код, я просто получил строку test
(начальное значение файла) и "This is some text"
не записал в поток. Как мне это сделать?
Спасибо
Как сказал @TimRoberts, вам нужно сбросить запись сразу после sw.WriteLine
, вы можете сделать это так ` sw.Flush();`
Да, это работает. Я забыл этот код. Спасибо
после запуска этого кода я просто получаю тестовую строку (начальное значение файла) и «Это какой-то текст» в стрим не написал. Как мне это сделать?
Судя по вашему сообщению об ошибке, проблема, с которой вы столкнулись, возникает потому, что когда вы пишете в MemoryStream
с помощью StreamWriter
, он не сразу сбрасывает содержимое в базовый поток (в данном случае MemoryStream).
Чтобы гарантировать запись данных в MemoryStream, необходимо явно очистить StreamWriter после записи в него.
Вы также можете попробовать следующий способ:
byte[] allBytes = System.IO.File.ReadAllBytes(filePath);
using (MemoryStream memStream = new MemoryStream())
{
memStream.Write(allBytes, 0, allBytes.Length);
string additionalText = "This is some additional text";
byte[] additionalBytes = Encoding.UTF8.GetBytes(additionalText);
memStream.Write(additionalBytes, 0, additionalBytes.Length);
memStream.Position = 0;
// Read entire MemoryStream as a string
using (StreamReader sr = new StreamReader(memStream))
{
string result = sr.ReadToEnd();
Console.WriteLine(result);
}
}
Выход:
Примечание. Я тестировал приложение .NET 8 и основное приложение asp.net, оба работают как положено.
Вероятно, потому что
StreamWriter
все еще открыт и не очистил свой буфер. Сначала попробуйте использоватьStreamWriter.Close
.