Как сжать каталог с .NET?

У меня есть каталог, содержащий несколько файлов. Я хочу сжать эту папку в файл zip или tar.gz. Как я могу выполнять его работу на С#?

Ответ 1

Вы можете использовать DotNetZip Library. Он имеет довольно богатые и полезные функции.


EDIT:

string[] MainDirs = Directory.GetDirectories(DirString);

for (int i = 0; i < MainDirs.Length; i++)
{
    using (ZipFile zip = new ZipFile())
    {
        zip.UseUnicodeAsNecessary = true;
        zip.AddDirectory(MainDirs[i]);
        zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
        zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");
        zip.Save(string.Format("test{0}.zip", i));   
    }
}

Ответ 3

использовать 7zip из командной строки в С# → LZMA SDK поддерживает С#, и в пакете есть кодеки

Ответ 4

Я использую пространство имен System.IO.Packaging, которое было представлено в .NET Framework 3.5. Я решил использовать его, потому что он основан на базовых классах .NET Framework, и не требуется сторонний код, который взрывает размер кода.

здесь еще одна статья о Stackoverflow относительно этого вопроса

И здесь название и пространство ZipPackage/объяснение @MSDN

надеюсь, что поможет

Christian

Ответ 5

В моей предыдущей работе мы использовали # ziplib.

Ответ 6

Это хорошая дискуссия, в которой обсуждается возможность делать это без каких-либо сторонних библиотек. Я думаю, вам стоит взглянуть на это.

Вот большой репозиторий образцов кодов, которые могут помочь вам в вашей работе. Удачи..

Ответ 7

GZip является частью Microsoft Framework 2.0 и далее. Его называют GZipStream в пространстве имен System.IO.Compression.

Чтобы сжать каталог с этим классом, вам необходимо создать сериализуемый класс (например, каталог), который содержит коллекцию файлов.

Класс Files будет содержать имя файла и файловый поток для чтения байтов из файла. Как только вы примените GZip в Каталоге, он будет читать файлы один за другим и записывать их в GZipStream.

Проверьте эту ссылку: http://www.vwd-cms.com/forum/forums.aspx?topic=18

Ответ 8

Еще одна опция pre-3.5 - использовать утилиты zip из J #. В конце концов,.Net не волнует, на каком языке был изначально написан код: -).

Статьи о том, как это сделать:

Ответ 9

Вопрос довольно старый, и ответы тоже.

Лучший ответ с конца 2012 года: Использовать .NET 4.5 и содержащиеся классы пространства имен System.IO.Compression и System.IO.Compression.ZipArchive.

Один из многих примеров ссылок, которые вы получаете при поиске в Интернете: http://www.codeproject.com/Articles/381661/Creating-Zip-Files-Easily-in-NET

Начиная с 2014/2015 ff.: С Roslyn вся инфраструктурная библиотека была опубликована как Open Source, поэтому AFAI это понимает, вы можете извлечь код из классов 4.5 (так как это не должно быть специфично для системы) и использовать его как библиотеку для ранних .NET-фреймворков, Возможно, это даст некоторые преимущества лицензии по сравнению с другими классами, но это должно быть проанализировано вами.

Ответ 10

Вы можете архивировать каталог в чистом .NET 3.0.

Во-первых, вам понадобится ссылка на WindowsBase.dll.

Этот код откроет или создаст zip файл, создаст каталог внутри и поместит файл в этот каталог. Если вы хотите сжать папку, возможно, содержащую подкаталоги, вы можете перебрать файлы в каталоге и вызвать этот метод для каждого файла. Затем вы можете сначала выполнить поиск в подкаталогах файлов, вызвать метод для каждого из них и указать путь для создания этой иерархии в zip файле.

public void AddFileToZip(string zipFilename, string fileToAdd, string destDir)
{
    using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
    {
        string destFilename = "." + destDir + "\\" + Path.GetFileName(fileToAdd);
        Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
        if (zip.PartExists(uri))
        {
            zip.DeletePart(uri);
        }
        PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);

        using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
        {
            using (Stream dest = part.GetStream())
            {
                CopyStream(fileStream, dest);
            }
        }
    }
}

destDir может быть пустой строкой, которая поместит файл прямо в zip.

Источники: https://weblogs.asp.net/jongalloway/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib

https://weblogs.asp.net/albertpascual/creating-a-folder-inside-the-zip-file-with-system-io-packaging