Данные FileStream неполны при преобразовании MemoryStream в FileStream - PullRequest
0 голосов
/ 26 сентября 2011

Я пытаюсь создать файл с разделителями табуляции, используя данные, извлеченные из базы данных.Метод использования MemoryStream для создания StreamWriter и записи в него, кажется, работает нормально - цикл while (rdr.Read ()) выполняется около 40 раз.Но когда я перехожу к методу преобразования MemoryStream в FileStream, результирующий файл с разделителями табуляции показывает только 34 строки, а 34-я строка даже не завершена.Что-то ограничивает вывод.Не вижу ничего плохого в самих данных, которые могут привести к их внезапному завершению.

Вот метод преобразования:

protected internal static void ConvertMemoryStreamToFileStream(MemoryStream ms, String newFilePath){
        using (FileStream fs = File.OpenWrite(newFilePath)){
            const int blockSize = 1024;
            var buffer = new byte[blockSize];
            int numBytes;
            ms.Seek(0, SeekOrigin.Begin);
            while ((numBytes = ms.Read(buffer, 0, blockSize)) > 0){
                fs.Write(buffer, 0, numBytes);
            }
        }
    }

Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Нашел решение сам, так как никто не поможет.: (

В методе записи данных в MemoryStream необходимо добавить это до самого конца, прежде чем запускать метод для преобразования его в FileStream (где streamWriter - это запись StreamWriter в MemoryStream):

streamWriter.Flush();

Очевидно, это добавляет все «буферизованные» данные в поток, что бы это ни значило. Работа с памятью отстой.

0 голосов
/ 29 сентября 2011

Если вы используете .Net 4.0+, вы можете использовать новый Stream.CopyTo интерфейс:

ms.Seek(0, SeekOrigin.Begin);
using (var output = File.OpenWrite(newFilePath))
{
    ms.CopyTo(output);
}

Данные будут сброшены при удалении output.

...