C # GZipStream - Архивирование MemoryStreams - PullRequest
2 голосов
/ 31 марта 2012

У меня есть 5 MemoryStreams.Я хочу создать новый zip (который также будет потоком), в то время как каждый из 5 имеющихся у меня MemoryStream будет представлять файл.

У меня есть этот код о том, как сжать строку / 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?

1 Ответ

5 голосов
/ 31 марта 2012

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

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

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

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

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