Запись текстового файла в файл 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);
}