Запись текстового файла в файл gz с помощью GZipStream без предварительной записи текстового файла на диск

В настоящее время я генерирую большой вывод из нескольких запросов к базе данных. Итоговый файл XML составляет около 2 ГБ. (Это данные за годы). Чтобы сэкономить место на диске и время загрузки для клиента, я добавляю этот файл в сжатый файл, используя класс GZipStream. Смотрите ниже, как я в настоящее время сжимаю файл в gz. ПРИМЕЧАНИЕ. Файловый объект - это FileInfo.

using (FileStream inFile = fi.OpenRead())
using (FileStream outFile = File.Create(fi.FullName + ".gz"))
using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
{
    byte[] buffer = new byte[65536];
    int numRead;
    while ((numRead = inFile.Read(buffer, 0, buffer.Length)) != 0)
    {
        Compress.Write(buffer, 0, numRead);
    }
}

Этот метод работает нормально, но требует, чтобы я записал 2 ГБ текстовый файл на диск, а затем снова прочитал все это, чтобы добавить его в GZipStream, а затем снова записать обратно в виде сжатого файла. Это кажется пустой тратой времени.

Есть ли способ добавить мою строку 2 ГБ непосредственно в GZipStream без предварительной записи на диск?

2 ответа

Решение

Если есть какой-то способ, которым вы можете получить результат базы данных в строку, а затем загрузить его в MemoryStream, у вас все будет в порядке:

        var databaseResult = "<xml>Very Long Xml String</xml>";

        using (var stream = new MemoryStream())
        {
            using (var writer = new StreamWriter(stream))
            {
                writer.Write(databaseResult);
                writer.Flush();
                stream.Position = 0;

                using (var outFile = File.Create(@"c:\temp\output.xml.gz"))
                using (var Compress = new System.IO.Compression.GZipStream(outFile, CompressionMode.Compress))
                {
                    var buffer = new byte[65536];
                    int numRead;
                    while ((numRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        Compress.Write(buffer, 0, numRead);
                    }
                }
            }
        }

Вы можете создать StreamWriter (или в вашем случае, возможно, XmlWriter) от GZipStream и просто напишите об этом вместо этого.

using (FileStream outFile = File.Create(fi.FullName + ".gz"))
using (GZipStream compress = new GZipStream(outFile, CompressionMode.Compress))
using (StreamWriter writer = new StreamWriter(compress))
{
    foreach(string line in GetLines())
        writer.WriteLine(line);
}
Другие вопросы по тегам