如何使用.NET压缩目录?

时间:2010-02-10 10:29:19

标签: c# file directory compression

我有一个包含多个文件的目录。我想将此文件夹压缩为zip或tar.gz文件。我怎样才能在C#中完成他的工作?

10 个答案:

答案 0 :(得分:8)

您可以使用DotNetZip Library。它具有相当丰富和实用的功能。


编辑:

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

答案 1 :(得分:8)

使用SharpZipLib。它支持C#中的GZip和ZIP压缩。

有一个很好的教程here概述了使用SharpZipLib压缩目录时需要做什么。

答案 2 :(得分:3)

在C#中使用命令行中的7zip - &gt; LZMA SDK支持C#,包中有代码示例

答案 3 :(得分:2)

我使用.NET Framework 3.5引入的System.IO.Packaging命名空间。我决定使用那个,因为它基于.NET Framework Ba​​se类,并且不需要第三方代码,这会破坏代码的大小。

here's关于此问题的另一篇关于Stackoverflow的文章

here's命名空间和ZipPackage声明/解释@MSDN

希望有所帮助

基督教

答案 4 :(得分:1)

在我之前的工作中,我们使用了#ziplib

答案 5 :(得分:0)

这是good discussion,讨论了在没有任何第三方库的情况下执行此操作的可能性。我想你应该看看它。

以下是large repository示例代码,可以帮助您完成工作。祝你好运..

答案 6 :(得分:0)

GZip是Microsoft Framework 2.0的一部分。 它在System.IO.Compression命名空间下调用GZipStream

要使用此类压缩目录,您必须创建一个包含文件集合的可序列化类(例如Directory)。

Files类将包含文件名和文件流以从文件中读取字节。 一旦你在目录上应用GZip,它将逐个读取文件并将它们写入GZipStream。

点击此链接:http://www.vwd-cms.com/forum/forums.aspx?topic=18

答案 7 :(得分:0)

另一个3.5之前的选项是使用J#的zip实用程序。毕竟,.Net并不关心最初编写代码的语言; - )。

有关如何执行此操作的文章:

答案 8 :(得分:0)

问题很老,答案也是如此。

自2012年底以来的最佳答案是:使用.NET 4.5以及包含的System.IO.CompressionSystem.IO.Compression.ZipArchive命名空间类。

您在互联网上搜索时收到的众多示例链接之一: http://www.codeproject.com/Articles/381661/Creating-Zip-Files-Easily-in-NET

自2014/2015起ff。: 使用Roslyn,整个框架库作为开源发布,因此AFAI理解它,您可以自由地从4.5类中提取代码(因为它应该不是特定于系统的),并将其用作早期.NET框架的库。也许这会比使用其他类提供一些许可优势 - 但这必须由您进行分析。

答案 9 :(得分:0)

您可以在纯.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