我一直在使用像这样的代码使用 "DotNetZip" 库来归档文件:
var files = new []
{
new { file = new FileInfo(@"C:\_test\Data\Testing\data.txt"), source = "Data" },
new { file = new FileInfo(@"C:\_test\Logs\Testing\data.txt"), source = "Logs" },
};
using (Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
{
zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
foreach (var f in files)
{
zipFile.AddFile(f.file.FullName, f.source);
}
zipFile.Save(@"C:\_test\output.zip");
}
需要注意的关键点是文件名相同,直接包含在同名文件夹中,在创建Zip文件时,我为文件创建了逻辑文件夹,以便文件放置没有文件名冲突。
问题在于Zip压缩非常糟糕。实际上,我有例子,其中我放入一堆小文件,然后得到一个更大的Zip文件!
然后我使用7-Zip进行了测试,结果非常好。文件大小比Zip小得多。
因此,我尝试使用7-Zip重写我的代码,但似乎没有.NET的良好7-Zip库,唯一的选择是通过命令行使用7-Zip。
我尝试在Powershell中执行此操作:
."C:\Program Files\7-Zip\7z.exe" a -mx9 "C:\_test\20210112 Testing.7z" "C:\_test\Data\Testing\data.txt" "C:\_test\Logs\Testing\data.txt"
但我得到的输出是:
7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21
Scanning the drive:
2 files, 40 bytes (1 KiB)
Creating archive: C:\_test\__test.7z
ERROR:
Duplicate filename on disk:
data.txt
data.txt
如果我添加了
-spf
命令行,那么它就有效了,但是我的文档现在是以每个以C
开头的文件夹为起点创建的。在7-Zip中,是否有一种方法可以允许从命令行添加项目时创建逻辑文件夹结构?
明确一下,我正在选择要归档的文件夹中的子集,并希望将它们放置在逻辑文件夹中。