it-swarm.com.ru

Папка Zip в C #

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


Обновление:

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

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


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

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

58
Marko

Этот ответ меняется с .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);
93
Jarrett Meyer

Из 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);
}
48
Simon

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

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

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

21
Noldorin

В .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-файла каталоги относительных путей будут обнаружены и созданы.

8
Gil Roitto

В пространстве имен 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

5
dr.

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

EDIT: Спасибо Cheeso за указание, что я немного отстал от времени. Пример MSDN, на который я указал, на самом деле использует DotNetZip и действительно очень полнофункциональный в наши дни. Основываясь на моем опыте предыдущей версии, я с радостью рекомендую его.

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

Богатые

4
Xiaofu

используя 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
Amen Ayach

Следующий код использует сторонний компонент 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

1
Martin Vobr

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

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

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

0
AndrewC

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
Alexey Semenyuk