2013-07-19 1 views
1

Я пытаюсь написать генерировать gzipped XML-файл из MemoryStream. Вот то, что я до сих пор -Запись в файл gzip из MemoryStream с использованием XmlWriter и GZipStream

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 

MemoryStream ms = new MemoryStream(); 
using (XmlWriter writer = XmlWriter.Create(ms, settings)) 
{ 
    // CREATE XML 
} 

Тогда я хочу взять этот поток, и сохранить его в сжатом файле. Я видел много примеров с помощью GZipStream, но никто точно не соответствует этому.

+0

Возможно, вам стоит взглянуть на простое управление сжатием gzip на уровне сервера. Вы можете получить все gml-ответы gml, сжатые на уровне IIS. –

ответ

3

Чтобы сохранить документ в сжатом файле, вы должны создать два потока:

using (var fs = File.Create(fileName)) 
{ 
    using (var gz = new GZipStream(fs, CompressionMode.Compress)) 
    { 
     doc.Save(gz); 
    } 
} 

Это предполагает, что вы создали XmlDocument. Затем он вызывает метод XmlDocument.Save(Stream).

Если вы хотите писать XML непосредственно в сжатый файл, вы можете написать:

using (var fs = File.Create(fileName)) 
{ 
    using (var gz = new GZipStream(fs, CompressionMode.Compress)) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     using (var writer = XmlWriter.Create(gz, settings)) 
     { 
      // write xml here 
     } 
    } 
} 

Вот так, что я хотел бы предложить, если вы просто хотите, чтобы написать GZIP сжатый файл XML.

Если вы действительно хотите сначала перейти к MemoryStream, а затем в сжатый файл, вы создаете поток памяти, как вы показываете в своем вопросе, а затем вы пишете его вот так.

using (var fs = File.Create(fileName)) 
{ 
    using (var gz = new GZipStream(fs, CompressionMode.Compress)) 
    { 
     ms.CopyTo(gz); 
    } 
} 

Не забудьте установить ms.Position = 0, прежде чем делать копию.

+0

Привет, Джим, я видел, что вы сделали комментарий в другом андресе, я бы скорее просто взял поток памяти и записал его в сжатый файл. Возможно, я неправильно понял ваш ответ. Это то, что вы говорили? Одна вещь, которую я не понимал, это 'doc.Save (gz)' в вашем ответе. Вы не определили документ. –

+0

@ABogus: см. Мой обновленный ответ, в частности второй пример. –

+0

Это отлично поработало для меня Джим. Спасибо! –

0

Прежде всего сохранить это в файл

XmlDocument doc = new XmlDocument(); 
doc.Save(writer); 

Затем с помощью методов почтового индекса, чтобы сжать его. Для сжатия

byte[] b; 
using (FileStream f = new FileStream("filename", FileMode.Open)) 
{ 
    b = new byte[f.Length]; 
    f.Read(b, 0, (int)f.Length); 
} 

using (FileStream f2 = new FileStream(fileName, FileMode.Create)) 
using (GZipStream gz = new GZipStream(f2, CompressionMode.Compress, false)) 
{ 
    gz.Write(b, 0, b.Length); 
} 
+0

Эй, Эхсан, Что такое «б» в вашем gz.Write statment? Байт-массив, правильно? Как его объявить? Нужно ли мне инициализировать его на что-нибудь? Благодаря! –

+0

@ABogus обновил код. – Ehsan

+0

Это работает, Ehsan, за исключением ... когда я распаковываю файл, кажется, что я теряю тип файла, тот факт, что это был файл XML, потерян. Любая идея почему? Большое спасибо за вашу помощь! –

 Смежные вопросы

  • Нет связанных вопросов^_^