Папка Zip в C # - PullRequest
       123

Папка Zip в C #

62 голосов
/ 25 мая 2009

Каков пример (простой код) того, как сжать папку в C #?


Обновление:

Я не вижу пространства имен ICSharpCode. Я скачал ICSharpCode.SharpZipLib.dll, но я не знаю, куда скопировать этот файл DLL. Что мне нужно сделать, чтобы увидеть это пространство имен?

А у вас есть ссылка на этот пример MSDN для папки с компрессией, потому что я прочитал все MSDN, но ничего не смог найти.


ОК, но мне нужна следующая информация.

Куда мне скопировать ICSharpCode.SharpZipLib.dll, чтобы увидеть это пространство имен в Visual Studio?

Ответы [ 10 ]

100 голосов
/ 30 июля 2012

Этот ответ меняется с .NET 4.5. Создание zip-файла становится невероятно простым . Сторонние библиотеки не требуются.

string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";
string extractPath = @"c:\example\extract";

ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
48 голосов
/ 25 мая 2009

Из файла справки DotNetZip , http://dotnetzip.codeplex.com/releases/

using (ZipFile zip = new ZipFile())
{
   zip.UseUnicodeAsNecessary= true;  // utf-8
   zip.AddDirectory(@"MyDocuments\ProjectX");
   zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G") ; 
   zip.Save(pathToSaveZipFile);
}
21 голосов
/ 25 мая 2009

В BCL нет ничего, чтобы сделать это для вас, но есть две замечательные библиотеки для .NET, которые поддерживают эту функциональность.

Я использовал оба и могу сказать, что оба они очень полны и имеют хорошо продуманные API, так что это в основном вопрос личных предпочтений.

Я не уверен, поддерживают ли они явно добавление Папок , а не только отдельные файлы в zip-файлы, но должно быть довольно легко создать что-то, что рекурсивно повторяется по каталогу и его подкаталогам DirectoryInfo и FileInfo классы.

8 голосов
/ 29 февраля 2016

В .NET 4.5 ZipFile.CreateFromDirectory (startPath, zipPath); Метод не охватывает сценарий, в котором вы хотите сжать несколько файлов и подпапок без необходимости помещать их в папку. Это действительно, если вы хотите, чтобы распаковать файлы прямо в текущую папку.

Этот код работал для меня:

public static class FileExtensions
{
    public static IEnumerable<FileSystemInfo> AllFilesAndFolders(this DirectoryInfo dir)
    {
        foreach (var f in dir.GetFiles())
            yield return f;
        foreach (var d in dir.GetDirectories())
        {
            yield return d;
            foreach (var o in AllFilesAndFolders(d))
                yield return o;
        }
    }
}

void Test()
{
    DirectoryInfo from = new DirectoryInfo(@"C:\Test");
    using (FileStream zipToOpen = new FileStream(@"Test.zip", FileMode.Create))
    {
        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
        {
            foreach (FileInfo file in from.AllFilesAndFolders().Where(o => o is FileInfo).Cast<FileInfo>())
            {
                var relPath = file.FullName.Substring(from.FullName.Length+1);
                ZipArchiveEntry readmeEntry = archive.CreateEntryFromFile(file.FullName, relPath);
            }
        }
    }
}

Папки не нужно «создавать» в zip-архиве. Второй параметр "entryName" в CreateEntryFromFile должен быть относительным путем, и при распаковке zip-файла будут обнаружены и созданы каталоги относительных путей.

5 голосов
/ 21 октября 2010

В пространстве имен System.IO.Packaging есть класс ZipPackage, который встроен в .NET 3, 3.5 и 4.0.

http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx

Вот пример того, как его использовать. http://www.codeproject.com/KB/files/ZipUnZipTool.aspx?display=Print

4 голосов
/ 25 мая 2009

На MSDN есть статья, в которой есть пример приложения для архивирования и разархивирования файлов и папок исключительно на C #. Я успешно использовал некоторые классы в этом в течение долгого времени. Код выпускается под лицензией Microsoft Permissive License, если вам нужно знать подобные вещи.

РЕДАКТИРОВАТЬ: Спасибо Cheeso за указание, что я немного отстал. Пример MSDN, на который я указывал, на самом деле использует DotNetZip и действительно очень полнофункциональный в наши дни. Основываясь на моем опыте предыдущей версии, я с радостью рекомендую его.

SharpZipLib также является довольно зрелой библиотекой, высоко оцененной людьми и доступной по лицензии GPL. Это действительно зависит от ваших требований к архивированию и от того, как вы просматриваете условия лицензии для каждого из них.

Rich

1 голос
/ 18 мая 2018

с использованием DotNetZip (доступно как пакет nuget):

public void Zip(string source, string destination)
{
    using (ZipFile zip = new ZipFile
    {
        CompressionLevel = CompressionLevel.BestCompression
    })
    {
        var files = Directory.GetFiles(source, "*",
            SearchOption.AllDirectories).
            Where(f => Path.GetExtension(f).
                ToLowerInvariant() != ".zip").ToArray();

        foreach (var f in files)
        {
            zip.AddFile(f, GetCleanFolderName(source, f));
        }

        var destinationFilename = destination;

        if (Directory.Exists(destination) && !destination.EndsWith(".zip"))
        {
            destinationFilename += $"\\{new DirectoryInfo(source).Name}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ffffff}.zip";
        }

        zip.Save(destinationFilename);
    }
}

private string GetCleanFolderName(string source, string filepath)
{
    if (string.IsNullOrWhiteSpace(filepath))
    {
        return string.Empty;
    }

    var result = filepath.Substring(source.Length);

    if (result.StartsWith("\\"))
    {
        result = result.Substring(1);
    }

    result = result.Substring(0, result.Length - new FileInfo(filepath).Name.Length);

    return result;
}

Использование:

Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest");

Или

Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest\output.zip");
1 голос
/ 15 июля 2010

В следующем коде используется сторонний ZIP-компонент от Rebex :

// add content of the local directory C:\Data\  
// to the root directory in the ZIP archive
// (ZIP archive C:\archive.zip doesn't have to exist) 
Rebex.IO.Compression.ZipArchive.Add(@"C:\archive.zip", @"C:\Data\*", "");

Или, если вы хотите добавить больше папок без необходимости открывать и закрывать архив несколько раз:

using Rebex.IO.Compression;
...

// open the ZIP archive from an existing file 
ZipArchive zip = new ZipArchive(@"C:\archive.zip", ArchiveOpenMode.OpenOrCreate);

// add first folder
zip.Add(@"c:\first\folder\*","\first\folder");

// add second folder
zip.Add(@"c:\second\folder\*","\second\folder");

// close the archive 
zip.Close(ArchiveSaveAction.Auto);

Вы можете скачать ZIP-компонент здесь .

Использование бесплатной лицензии LGPL SharpZipLib является распространенной альтернативой.

Отказ от ответственности: я работаю на Rebex

0 голосов
/ 18 декабря 2014

ComponentPro ZIP может помочь вам решить эту задачу. Следующий фрагмент кода сжимает файлы и директории в папке. Вы также можете использовать маску Уилкарда.

using ComponentPro.Compression;
using ComponentPro.IO;

...

// Create a new instance.
Zip zip = new Zip();
// Create a new zip file.
zip.Create("test.zip");

zip.Add(@"D:\Temp\Abc"); // Add entire D:\Temp\Abc folder to the archive.

// Add all files and subdirectories from 'c:\test' to the archive.
zip.AddFiles(@"c:\test");
// Add all files and subdirectories from 'c:\my folder' to the archive.
zip.AddFiles(@"c:\my folder", "");
// Add all files and subdirectories from 'c:\my folder' to '22' folder within the archive.
zip.AddFiles(@"c:\my folder2", "22");
// Add all .dat files from 'c:\my folder' to '22' folder within the archive.
zip.AddFiles(@"c:\my folder2", "22", "*.dat");
// Or simply use this to add all .dat files from 'c:\my folder' to '22' folder within the archive.
zip.AddFiles(@"c:\my folder2\*.dat", "22");
// Add *.dat and *.exe files from 'c:\my folder' to '22' folder within the archive.
zip.AddFiles(@"c:\my folder2\*.dat;*.exe", "22");

TransferOptions opt = new TransferOptions();
// Donot add empty directories.
opt.CreateEmptyDirectories = false;
zip.AddFiles(@"c:\abc", "/", opt);

// Close the zip file.
zip.Close();

http://www.componentpro.com/doc/zip имеет больше примеров

0 голосов
/ 25 марта 2010

"Where should I copy ICSharpCode.SharpZipLib.dll to see that namespace in Visual Studio?"

Вам необходимо добавить файл dll в качестве ссылки в ваш проект. Щелкните правой кнопкой мыши на References в Solution Explorer-> Add Reference-> Browse и выберите dll.

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

...