Как использовать Систему. IO.Compression к zip-файлам чтения-записи?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

19
задан Community 23 May 2017 в 12:24
поделиться

5 ответов

MSDN имеет полное пример http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx использование класса ZipPackage. Требует.NET 3.5.

17
ответ дан 30 November 2019 в 03:12
поделиться

Dave, очень хороший!! Я не знал, что это было там.

Теперь, когда я знаю, что искать, я смог найти статью с маленьким примером кода о том, как использовать его: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

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

7
ответ дан 30 November 2019 в 03:12
поделиться

Да, я использовал его в прошлом. Я разделил на подклассы DataSet однажды для поддержки сохранения себя в файл (через ReadXML / метод WriteXML ). Как добавленная премия, я решил позволить этому быть, дополнительно, сжатым при желании (это, как необходимо уже знать, является чрезвычайно эффективным с текстовыми данными как XML).

я использовал класс GZipStream (это было мое понимание в то время, когда связанным DeflateStream был просто GZip без информации заголовка или некоторый такой — я уверен, что кто-то мог исправить меня на этом). Это работает вполне просто путем осуществления контрейлерных перевозок сверху другого потока, и таким образом Вы затем используете GZipStream в его месте. В моем случае это осуществляло контрейлерные перевозки на FileStream.

, Учитывая MemoryStream, чтобы быть заполненным выводом myDataSet.WriteXML(), я сделал что-то как следующее:

if (CompressData)
{
    // Write to memory
    mStream = new MemoryStream();
    Save(mStream);
    mStream.Seek(0, SeekOrigin.Begin);

    // Filter that through a GZipStream and then to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
                             FileMode.OpenOrCreate);
    zipStream = new GZipStream(fStream, CompressionMode.Compress, true);

    Pump(mStream, zipStream);
}
else
{
    // Write straight to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
                             FileMode.OpenOrCreate);
    Save(fStream);
}

, Где Save() и Pump() простые методы как следующее:

private void Pump(Stream input, Stream output)
{
    int n;
    byte[] bytes = new byte[4096]; // 4KiB at a time

    while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
    {
        output.Write(bytes, 0, n);
    }
}

public void Save(Stream stream)
{
    AcceptChanges();

    WriteXml(stream, XmlWriteMode.WriteSchema);
}
0
ответ дан 30 November 2019 в 03:12
поделиться

Вы захотите пользоваться сторонней библиотекой, как http://www.codeplex.com/DotNetZip , вместо того, чтобы пытаться использовать GZipStream или DeflateStream для чтения zip-файла.

*** Потоковые классы в.NET могут позволить Вам читать или записать сжатые потоки байтов. Эти классы НЕ читают или пишут zip-файлы. Zip-файл является сжатыми данными, окруженными "конвертом" или заголовком. Думайте о нем как о метаданных - это включает название файла, метки времени, CRC и набора другого материала. ** Потоковые классы производят только поток сжатых данных и не знают, как произвести или использовать метаданные, которые описаны в спецификации формата PKZip, сохраняемой PKWare.

Сторонние библиотеки как DotNetZip обрабатывают метаданные в архиве ZIP. Они могут или не могут использовать Систему. IO.Compression. DeflateStream () класс к произведенному сжатый поток байтов. В предыдущих выпусках, например, DotNetZip использовал встроенный DeflateStream. С v1.7 DotNetZip включает свой собственный DeflateStream, который более эффективен, чем тот, поставленный в Платформе.NET. Как дополнительное преимущество, встроенный DeflateStream в DotNetZip позволяет DotNetZip использоваться на.NET Компактная Платформа 2.0, который испытывает недостаток в Системе. IO.Compression. DeflateStream. (это было добавлено в Компактной Платформе 3.5)

существует хороший форум по сайту DotNetZip, если у Вас есть больше вопросов. Пример код C#:

    try
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory(DirectoryToZip); // recurses subdirs
            zip.Save(Filename);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }
7
ответ дан 30 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: