这个 MSDN站点有一个 gzip 文件的示例。那么,我怎样才能 gzip 一个包含子目录的整个目录呢?
4 回答
由于 gzip 仅适用于文件,因此我建议您 tar 目录,然后 gzip 生成的 tar 文件。
您可以使用tar-cs或SharpZipLib来生成您的 tar 文件。
你不能!
GZip 是为文件而不是目录创建的 :)
gzip 在一个单一的流上运行。要使用 gzipstream 创建多流(多文件)存档,您需要包含自己的索引。基本上,在最简单的情况下,您会将文件偏移量写入输出流的开头,然后当您将其读回时,您就会知道边界在哪里。此方法与 PKZIP 不兼容。为了兼容,您必须阅读并实现 ZIP 格式……或使用 SharpZip 或 Zip.NET 之类的东西
您可以在纯 .NET 3.0 中压缩目录。由于修改了 GPL 许可证,可能不希望使用 SharpZipLib。
首先,您需要对 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