DotNetZip添加文件而不创建文件夹

36
using (ZipFile zip = new ZipFile())
{
    foreach(string file in Directory.GetFiles(folder))
    {
        zip.AddFile(file, Path.GetFileName(file));
    }
    zip.Save("test.zip"));
}

每次我添加一个文件,它都会创建一个新的子文件夹。

因此我希望最终结果是:

test.zip
    -  myDoc.doc
    -  myPdf.pdf

但我最终得到的是:

test.zip
    -  myDoc.doc
        -  myDoc.doc
    -  myPdf.pdf
        -  myPdf.pdf
4个回答

79

那么只需要这样:

zip.AddFile(file,"");
或者
zip.AddFile(file,@"\");

这使情况变得更糟。例如,文件路径 Documents\Process\Practices\text.doc 将为路径中的每个级别创建一个子文件夹,因此您最终会得到 test.zip -> Documents -> Process -> Practices -> text.doc - fearofawhackplanet
1
@Fosco 这个有效。有没有关于这个的完整文档?我正在使用来自nuGet的IonicZip.dll。 - Praveen
dotnet的zip压缩比不太好。我用dotnet zip压缩了一个152KB的文档文件,但是压缩后的zip文件大小为136KB。是否存在任何调整可以创建更小的zip文件?分享一下知识,谢谢。 - Mou
1
@Mou - 现在的文档文件就像.zip文件一样,并且它们已经大部分被压缩了。里面仍然有一些未被压缩的部分,以便外部程序可以读取属性/摘要信息等,但通常它们已经非常紧凑了。 - Clay
@Fosco 谢谢你提供的好解决方案。你帮我节省了时间。 - Avtandil Kavrelishvili

0

因为批准的答案是4年前的,现在有另一种更优雅的方法来完成这个任务。如果你想压缩目录中的所有文件(就像上面的代码),你可以使用以下命令:

ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, compressionLevel, includeBaseDirectory)

你对最后一个参数(includeBaseDirectory)感兴趣,并传递false值。

更多信息可以在这里找到:CreateFromDirectory(String, String, CompressionLevel, Boolean)


-2
zip.AddFile(file, "..\...\".ToString.Replace("..\...\", null))

-3

这就是我所做的,而且它起作用了。

zip.AddFile(file, "..\...\".ToString.Replace("..\...\", Nothing))

它将文件发送回2个文件夹,并用空白替换.....。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接