2012-03-31 3 views
2

У меня есть 5 MemoryStreams. Я хочу создать новый zip (который также будет Stream), в то время как каждый из 5 MemoryStreams, который у меня есть, будет respresnt файла.C# GZipStream - Zipping MemoryStreams

У меня есть этот код о том, как закодировать строку/1 MemoryStream.

public static string Zip(string value) 
{ 
    //Transform string into byte[] 
    byte[] byteArray = new byte[value.Length]; 
    int indexBA = 0; 
    foreach (char item in value.ToCharArray()) 
    { 
     byteArray[indexBA++] = (byte)item; 
    } 

    //Prepare for compress 
    System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
    System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, 
     System.IO.Compression.CompressionMode.Compress); 

    //Compress 
    sw.Write(byteArray, 0, byteArray.Length); 
    //Close, DO NOT FLUSH cause bytes will go missing... 
    sw.Close(); 

    //Transform byte[] zip data to string 
    byteArray = ms.ToArray(); 
    System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length); 
    foreach (byte item in byteArray) 
    { 
     sB.Append((char)item); 
    } 
    ms.Close(); 
    sw.Dispose(); 
    ms.Dispose(); 
    return sB.ToString(); 
} 

Этот код хорош, но мне нужно какое-то разделение между MemoryStreams. Я не хочу, чтобы они были последовательными. (Желательно, чтобы они были в разных файлах в ZipStream)

Как создать файлы (или аналогичные разделители) в ZipStream?

ответ

5

GZipStream в .net-библиотеке на самом деле не предназначен для создания zip-файлов. Основной целью является сжатие потока, который может быть передан для данных или в вашем примере выше потоковой передачи в файл.

объекты Сжатый GZipStream записываемые в файл с расширением .gz могут быть распакованы с использованием многих общих инструментов сжатия; однако этот класс по своей сути не обеспечивает функциональность для добавления файлов или извлечения файлов из архивов .zip.

Вы можете получить библиотеку GZip для создания zip-файла с несколькими сжатыми файлами, но для этого вам потребуются некоторые работы с вашей стороны. Существует сообщение в блоге here, в котором показано, как это сделать.

Однако есть некоторые другие решения, которые вы могли бы рассмотреть:

  1. SharpZipLib является свободным и широко используется библиотека сжатия. Ссылка предоставлена ​​вики, в которой показано, как сжимать и распаковывать. Вы можете деактивировать/сжать файлы и потоки.
  2. .net 3 имеет библиотеку packaging, на которую вы можете посмотреть. Следует отметить, что он будет содержать метаданные. Также эта библиотека не может открывать zip-файлы, которые не содержат метаданных. В приведенной ссылке приведен пример внизу о том, как сжимать несколько файлов.
  3. Существуют и другие бесплатные библиотеки, но я их не использовал.
Смежные вопросы