C#中的Zip文件夹


72

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


更新:

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

而且,您是否具有该MSDN示例的compress文件夹的链接,因为我阅读了所有MSDN,但找不到任何内容。


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

我应该复制ICSharpCode.SharpZipLib.dll到哪里才能在Visual Studio中看到该名称空间?


(对问题的“答复”进行了跟进)
Marc Gravell

2
项目->添加参考->选择库
Ivo,2010年

Answers:


131

答案随着.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);

37
这很好。不要忘记添加对System.IO.Compression.FileSystem的引用和对System.IO.Compression的using语句。
斯科特

1
我不敢相信这有多简单。非常感谢!
汤姆(Tom)

1
使用原始路径和目标路径相同时出现错误,因此请记住使用与原始路径不同的目标路径。
ThanhLD '19

@ThanhLD是的,他们没有做到这一点,因此很遗憾,您可以将其result.zip放入文件夹(即startPath
。– JohnB,

51

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
@JohnB此后已被弃用
TheGeekZn 2014年

2
这将添加目录的内容。我想像在zip中一样包含Main目录,然后在其中包含ProhjectX?
Mayur Patel

22

BCL中没有什么可以为您执行此操作的,但是.NET有两个很棒的库,它们确实支持该功能。

我已经使用了两者,可以说两者非常完整并且具有经过精心设计的API,因此主要是个人喜好问题。

我不确定它们是否明确支持添加文件夹,而不只是将单个文件添加到zip文件,但是使用DirectoryInfoFileInfo类创建在目录及其子目录上递归迭代的内容应该很容易。


1
DotNetZip支持通过ZipFile.AddDirectory()方法将目录添加到zip文件中。它遍历目录。
Cheeso

您可以使用SharpZipLib添加文件夹,只需在zip条目名称中添加文件夹名称加斜杠(无论向前还是向后都无法记住)即可。
devios1 2011年


1
+1代表DotNetZip。我工作的组织广泛使用它,非常适合执行各种任务。
杰米·基林

14

在.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归档文件中“创建”文件夹。CreateEntryFromFile中的第二个参数“ entryName”应为相对路径,并且在解压缩zip文件时,将检测并创建相对路径的目录。


谢谢。这真的帮助了我!不知道为什么不投票更多。我在这里引用了您的答案: stackoverflow.com/questions/36872218/…–
戴夫

@ShmilTheCat您可以尝试对文件夹使用.CreateEntry方法吗?见stackoverflow.com/questions/15133626/...
吉尔Roitto


4

MSDN上有一篇文章,其中包含一个示例应用程序,该应用程序用于纯粹使用C#来压缩和解压缩文件和文件夹。我已经成功使用了其中的一些类很长时间了。如果您需要了解此类情况,则根据Microsoft许可许可证发布该代码。

编辑:感谢Cheeso指出我落后于时代。我所指出的MSDN示例实际上是使用DotNetZip的,并且如今这些功能非常强大。根据我以前的经验,我很乐意推荐它。

SharpZipLib也是一个相当成熟的库,受到人们的高度评价,并已获得GPL许可。这实际上取决于您的压缩需求以及如何查看它们的许可条款。

丰富


MSDN上的示例代码使用DotNetZip,DotNetZip是一个免费的zip库,它支持压缩级别和加密(包括AES加密),尽管您引用的特定示例并未显示该内容。该库将生成“适当的” zip文件。
Cheeso

感谢您提及。我仍在使用几年前的原始版本,它只是一个独立的代码示例,因此看起来他们已经做了很多工作。
小夫

我对Cheeso表示歉意,因为如果不是DotNetZip库的作者,您似乎是您的管理员!事实证明,它对我非常有用,即使是从我第一次遇到它的早期形式。:)
孝夫

根据Cheeso的评论进行编辑。
小夫

1

以下代码使用Rebex的第三方ZIP组件

// 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

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

0

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

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

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


0

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


FWIW,请参阅cheated.by.safabyte.net,其中显示Component Pro可能代表了最新的被盗软件。TY
iokevins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.