Как я могу сжать каталог с .NET? - PullRequest
10 голосов
/ 10 февраля 2010

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

Ответы [ 10 ]

8 голосов
/ 10 февраля 2010

Изучите использование SharpZipLib . Он поддерживает сжатие GZip и ZIP в C #.

Здесь есть превосходное учебное пособие , в котором описывается, что нужно сделать, чтобы сжать каталог с помощью SharpZipLib.

8 голосов
/ 10 февраля 2010

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


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 голосов
/ 10 февраля 2010

используйте 7zip из командной строки в C # -> LZMA SDK поддерживает C #, и в пакете есть примеры кода

2 голосов
/ 10 февраля 2010

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

вот еще один пост на Stackoverflow по этому вопросу

И вот декларация / объяснение пространства имен и ZipPackage @ MSDN

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

Christian

1 голос
/ 10 февраля 2010

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

0 голосов
/ 13 апреля 2019

Вы можете сжать каталог в чистом .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

0 голосов
/ 17 июля 2015

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

Лучший ответ с конца 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 фф .: С Roslyn вся библиотека фреймворка была опубликована как Open Source, так что AFAI понимает это, вы можете свободно извлекать код из классов 4.5 (так как он не должен быть специфичным для системы) и использовать его в качестве библиотеки для более ранних .NET-фреймворков , Может быть, это дало бы некоторые преимущества по сравнению с другими классами, но вы должны это проанализировать.

0 голосов
/ 10 февраля 2010

Другой вариант до 3.5 - использовать утилиты zip из J #. В конце концов .Net не волнует, на каком языке изначально был написан код; -).

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

0 голосов
/ 10 февраля 2010

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

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

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

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

0 голосов
/ 10 февраля 2010

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

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

...