C#:以编程方式创建拆分 zip 文件
Posted
技术标签:
【中文标题】C#:以编程方式创建拆分 zip 文件【英文标题】:C#: Programmatically create a split zip file 【发布时间】:2018-05-23 15:41:05 【问题描述】:我想从大约 1.5GB 的文件夹中创建一个 zip 文件,并将该 zip 文件分成 100MB 的块。我已经找到了很多关于此的主题,但对我来说没有任何效果。
首先我尝试了 System.IO.Compression,但发现它不支持拆分 zip 文件(如果我错了,请纠正我!)。
接下来我尝试了 Ionic.zip,它看起来超级简单,但我创建的每组文件都以某种方式损坏(例如,以下代码使用 fonts 目录作为测试目录创建了一组文件,我然后无法使用 winzip 或 winrar 打开或解压缩为存档):
using (var zipFile = new Ionic.Zip.ZipFile(Encoding.UTF8))
zipFile.AddDirectory("c:\\windows\\fonts", directoryPathInArchive: string.Empty);
zipFile.MaxOutputSegmentSize = 100 * 1000000;
zipFile.Save("c:\\users\\me\\test.zip");
最后,我尝试了 7z.dll 和 SharpCompress。使用命令行和 7z.exe 文件,以下内容完美运行:
7z.exe a "c:\users\me\test.zip" "c:\Windows\Fonts" -v100m
但是下面的代码给出了错误“值不在预期范围内。”
SevenZipCompressor.SetLibraryPath("c:\\program files\\7-zip\\7z.dll");
var compressor = new SevenZipCompressor();
compressor.CompressionMethod = CompressionMethod.Lzma2;
compressor.CustomParameters.Add("v", "100m");
compressor.CompressDirectory("c:\\windows\\fonts\\", "c:\\users\\me\\test.zip");
我还尝试了以下方法(试图弄清楚命令行开关在 SharpCompress 中是如何工作的),它确实创建了一个 zip 文件,但没有将其拆分:
SevenZipCompressor.SetLibraryPath("c:\\program files\\7-zip\\7z.dll");
var compressor = new SevenZipCompressor();
compressor.CompressionMethod = CompressionMethod.Lzma2;
compressor.CustomParameters.Add("mt", "on");
compressor.CustomParameters.Add("0", "LZMA2:c=100m");
compressor.CompressDirectory("c:\\windows\\fonts\\", "c:\\users\\me\\test.zip");
有谁知道为什么上述任何方法都不起作用?或者还有其他我还没有尝试过的人们开始工作的方式吗?
谢谢!
【问题讨论】:
你不能简单地使用Process.Start()
调用7z.exe吗?
你在用这个github.com/adamhathcock/sharpcompress吗?在该页面的“待办事项”下显示“多卷 Zip 支持”。我认为这意味着 SharpCompress 不能(还)做你想要完成的事情。
“拆分”到底是什么意思?您希望生成的
@MarkAdler 我想获得与命令行使用“v”选项相同的结果。您会得到几个扩展名为 .001、.002、.003 的文件(大小都在您指定的范围内)。然后您可以选择其中一个并一次提取所有文件。
@DanWilson 是的,我现在可以做到这一点(尽管我不能更优雅地做到这一点!)。干杯! (试图支持您的评论,但由于某种原因不能,抱歉)
【参考方案1】:
我不知道支持 PKZIP 拆分 zip 文件格式的库。
【讨论】:
【参考方案2】:这是一个老问题,但 Ionic 正在工作。也许有点棘手,但没关系。我的第一个版本还创建了一组我无法解压缩的文件。但是改变命令的顺序后,输出就可以解压了。
private static void CreateEncryptedZipFile(string filename, string to, FileInfo fi, string password)
using (var zipFile = new Ionic.Zip.ZipFile())
zipFile.Password = password;
zipFile.Encryption = Ionic.Zip.EncryptionAlgorithm.WinZipAes256;
zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zipFile.AddFile(filename, directoryPathInArchive: string.Empty);
zipFile.MaxOutputSegmentSize = 1024*1024*128;
zipFile.Save(to + ".zip");
createXMLInfo(fi, to);
【讨论】:
以上是关于C#:以编程方式创建拆分 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章