Nomar记录一段历史
压缩/解压缩文件夹和文件

有谁知道在 C# 中快速压缩或解压缩文件和文件夹的好方法?可能需要处理大文件。

9个回答

我一直在使用 SharpZip 库。

这是一个链接

注意:几年前我在 SharpZip 代码中发现了一个int 溢出错误,导致它在碰巧具有正确值组合的随机文件上失败。不知道这曾经得到固定的,而是从内存中,我改变了int变量一long在SharpZip源,以避免溢出。我将不得不尝试找到我旧的固定 SharpZip 代码并检查它是否与最新的.

这在 Java 中很容易实现,如上所述,您可以从 C# 访问 java.util.zip 库。参考资料见:

java.util.zip javadocs
示例代码

不久前我使用它对文件夹结构进行了深度(递归)压缩,但我认为我从未使用过解压缩。如果我有动力,我可能会拉出该代码并稍后将其编辑到此处。

.Net 2.0 框架命名空间System.IO.Compression支持 GZip 和 Deflate 算法。这里有两种方法可以压缩和解压缩可以从文件对象中获取的字节流。您可以在以下方法中用GZipStream替换DefaultStream以使用该算法。尽管如此,这仍然存在处理使用不同算法压缩的文件的问题。

 public static byte[] Compress(byte[] data) { MemoryStream output = new MemoryStream(); GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true); gzip.Write(data, 0, data.Length); gzip.Close(); return output.ToArray(); } public static byte[] Decompress(byte[] data) { MemoryStream input = new MemoryStream(); input.Write(data, 0, data.Length); input.Position = 0; GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true); MemoryStream output = new MemoryStream(); byte[] buff = new byte[64]; int read = -1; read = gzip.Read(buff, 0, buff.Length); while (read > 0) { output.Write(buff, 0, read); read = gzip.Read(buff, 0, buff.Length); } gzip.Close(); return output.ToArray(); }

另一个不错的选择也是DotNetZip

我的回答是闭上眼睛,选择DotNetZip 。它已经过大型社区的测试。

您可以使用此方法创建 zip 文件:

 public async Task<string> CreateZipFile(string sourceDirectoryPath, string name) { var path = HostingEnvironment.MapPath(TempPath) + name; await Task.Run(() => { if (File.Exists(path)) File.Delete(path); ZipFile.CreateFromDirectory(sourceDirectoryPath, path); }); return path; }

然后您可以使用以下方法解压缩 zip 文件:

1- 此方法适用于 zip 文件路径

public async Task ExtractZipFile(string filePath, string destinationDirectoryName) { await Task.Run(() => { var archive = ZipFile.Open(filePath, ZipArchiveMode.Read); foreach (var entry in archive.Entries) { entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true); } archive.Dispose(); }); }

2- 此方法适用于 zip 文件流

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName) { string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue); using (FileStream output = new FileStream(filePath, FileMode.Create)) { await zipFile.CopyToAsync(output); } await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName)); await Task.Run(() => File.Delete(filePath)); }

随机文章