我有一个包含多个文件的目录。我想将此文件夹压缩为zip或tar.gz文件。我怎样才能在C#中完成他的工作?
答案 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)
答案 3 :(得分:2)
我使用.NET Framework 3.5引入的System.IO.Packaging命名空间。我决定使用那个,因为它基于.NET Framework Base类,并且不需要第三方代码,这会破坏代码的大小。
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。
答案 7 :(得分:0)
另一个3.5之前的选项是使用J#的zip实用程序。毕竟,.Net并不关心最初编写代码的语言; - )。
有关如何执行此操作的文章:
答案 8 :(得分:0)
问题很老,答案也是如此。
自2012年底以来的最佳答案是:使用.NET 4.5以及包含的System.IO.Compression
和System.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/albertpascual/creating-a-folder-inside-the-zip-file-with-system-io-packaging