Сведения о вопросе

DUNKER

16:03, 1st July, 2020

Теги

c#   .net   file   compression    

Сжатие / Распаковка Папок И Файлов

Просмотров: 507   Ответов: 9

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



  Сведения об ответе

+-*/

18:03, 1st July, 2020

Пространство имен .Net 2.0 framework System.IO.Compression поддерживает алгоритмы GZip и Deflate. Вот два метода, которые сжимают и распаковывают поток байтов,который вы можете получить из вашего объекта file. Вы можете заменить 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();
}


  Сведения об ответе

P_S_S

18:03, 1st July, 2020

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

Вот такая ссылка


  Сведения об ответе

ASER

18:03, 1st July, 2020

По состоянию на .Net 1.1 единственным доступным методом является обращение к библиотекам java.
Использование классов Zip в библиотеках классов J# для сжатия файлов и данных с помощью C#
Не уверен, что это изменилось в последних версиях.


  Сведения об ответе

KOMP

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

JUST___

18:03, 1st July, 2020

Мой ответ будет заключаться в том, что вы закроете глаза и выберете DotNetZip . Это было проверено большим сообществом.


  Сведения об ответе

SSESION

18:03, 1st July, 2020

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


  Сведения об ответе

PIRLO

18:03, 1st July, 2020

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

java.util.zip документации
пример кода

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


  Сведения об ответе

DAAA

18:03, 1st July, 2020

Еще одна хорошая альтернатива - это тоже DotNetZip .


  Сведения об ответе

screen

18:03, 1st July, 2020

с помощью этого метода можно создать файл 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));
    }


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться