Сжатие / распаковка папок и файлов

Кто-нибудь знает, как быстро сжать или распаковать файлы и папки на C#? Может потребоваться обработка больших файлов.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
54
0
4 666
9

Ответы 9

Начиная с .Net 1.1, единственный доступный метод - это доступ к библиотекам java.

Использование классов Zip в библиотеках классов J # для сжатия файлов и данных с помощью C#

Не уверен, изменилось ли это в последних версиях.

Я всегда использовал библиотеку SharpZip.

Вот ссылка

Примечание. Несколько лет назад я обнаружил ошибку int переполнение в коде SharpZip, которая приводила к сбою в случайных файлах, которые просто случайно имели правильную комбинацию значений. Не уверен, что это когда-либо было исправлено, но по памяти я изменил переменную int на long в исходном коде SharpZip, чтобы избежать переполнения. Мне нужно будет попытаться найти мой старый исправленный код SharpZip и проверить, соответствует ли он последнему.

Gone Coding 17.03.2014 20:41

Вы можете использовать Сторонняя библиотека, например SharpZip, как указал Том.

Другой способ (без стороннего использования) - использовать Windows Shell API. Вам нужно будет установить ссылку на COM-библиотеку Microsoft Shell Controls и Automation в вашем проекте C#. У Джеральда Гибсона есть пример по адресу:

Копия мертвой страницы Интернет-архива

Это очень легко сделать в java, и, как указано выше, вы можете получить доступ к библиотекам java.util.zip из C#. Ссылки см .:

java.util.zip javadocs
образец кода

Я использовал это некоторое время назад, чтобы сделать глубокий (рекурсивный) zip для структуры папок, но я не думаю, что когда-либо использовал распаковку. Если я так мотивирован, я могу вытащить этот код и отредактировать его здесь позже.

Пространство имен инфраструктуры .Net 2.0 System.IO.Compression поддерживает алгоритмы GZip и Deflate. Вот два метода сжатия и распаковки байтового потока, который вы можете получить из своего файлового объекта. Вы можете заменить GZipStream на DefaultStream в приведенных ниже методах, чтобы использовать этот алгоритм. Тем не менее, это по-прежнему оставляет проблему с обработкой файлов, сжатых с помощью других алгоритмов.

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}

Другой хорошей альтернативой является также DotNetZip.

GZipStream - действительно хорошая утилита.

Я бы ответил, что закрой глаза и выберу DotNetZip. Он был протестирован большим сообществом.

Вы можете создать zip-файл с помощью этого метода:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name)
{
    var path = HostingEnvironment.MapPath(TempPath) + name;
    await Task.Run(() =>
    {
        if (File.Exists(path)) File.Delete(path);
        ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
    });
    return path;
}

а затем вы можете распаковать zip-файл с помощью следующих методов:

1- Этот метод работает с путем к zip-файлу

public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
{
    await Task.Run(() =>
    {
        var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
        foreach (var entry in archive.Entries)
        {
            entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
        }
        archive.Dispose();
    });
}

2- Этот метод работает с потоком zip-файла

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
{
    string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
    using (FileStream output = new FileStream(filePath, FileMode.Create))
    {
        await zipFile.CopyToAsync(output);
    }
    await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
    await Task.Run(() => File.Delete(filePath));
}

Другие вопросы по теме