C#中的Zip文件夹

时间:2009-05-25 07:00:35

标签: c# zip directory archive compression

如何在C#中压缩文件夹的示例(简单代码)是什么?


更新

我没有看到名称空间ICSharpCode。我下载了ICSharpCode.SharpZipLib.dll,但我不知道在哪里复制该DLL文件。如何查看此命名空间需要做什么?

你有压缩文件夹的MSDN示例的链接,因为我读了所有的MSDN,但我找不到任何东西。


好的,但我需要下一个信息。

我应该在哪里复制ICSharpCode.SharpZipLib.dll以在Visual Studio中查看该命名空间?

10 个答案:

答案 0 :(得分:100)

此答案随.NET 4.5而变化。创建zip文件becomes incredibly easy。不需要第三方图书馆。

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

ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);

答案 1 :(得分:48)

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);
}

答案 2 :(得分:21)

BCL中没有任何内容可以为您完成此操作,但有两个很棒的.NET库可以支持这些功能。

我已经使用了两者,并且可以说这两者非常完整且设计良好的API,所以这主要取决于个人喜好。

我不确定他们是否明确支持添加文件夹而不仅仅是单个文件来压缩文件,但是创建一些以递归方式遍历目录及其子目录的内容应该很容易使用DirectoryInfoFileInfo类。

答案 3 :(得分:8)

在.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);
            }
        }
    }
}

文件夹不需要&#34;创建&#34;在zip-archive中。第二个参数&#34; entryName&#34;在CreateEntryFromFile中应该是一个相对路径,当解压缩zip文件时,将检测并创建相对路径的目录。

答案 4 :(得分:5)

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 :(得分:4)

有一篇关于MSDN的文章,其中有一个示例应用程序,用于压缩和解压缩纯粹在C#中的文件和文件夹。我已经成功地使用了一些类很长一段时间了。如果你需要知道那种事情,代码是在微软许可许可下发布的。

编辑:感谢Cheeso指出我有点落后于时代。我指出的MSDN示例实际上是使用DotNetZip,并且这些天真的非常全面。根据我之前版本的经验,我很乐意推荐它。

SharpZipLib也是一个非常成熟的图书馆,受到人们的高度评价,并且可以通过GPL许可证获得。这实际上取决于您的压缩需求以及您如何查看每个协议的许可条款。

答案 6 :(得分:1)

以下代码使用第三方ZIP component from 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);

你可以download the ZIP component here

使用免费的LGPL许可SharpZipLib是一种常见的选择。

免责声明:我为Rebex工作

答案 7 :(得分:1)

使用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");

答案 8 :(得分:0)

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

您需要在项目中添加dll文件作为参考。右键单击解决方案资源管理器中的引用 - >添加引用 - >浏览,然后选择dll。

最后,您需要将其作为using语句添加到要使用它的任何文件中。

答案 9 :(得分:0)

ComponentPro ZIP可以帮助您完成该任务。以下代码段压缩文件夹中的文件和dirs。您也可以使用威尔卡掩码。

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有更多示例