使用ZipArchive类在C#中创建存档内的存档

时间:2016-09-01 21:36:30

标签: c# .net zip .net-4.5 archive

正如标题所说,我正试图在拉链内创建一个拉链。

我在名为“TargetFilePath”的变量中创建了一个zip存档

var projectDirectoryPath = currentProjectViewModel.DirectoryPath;
ZipFile.CreateFromDirectory(projectDirectoryPath, TargetFilePath+@"/Project.zip");

以上不起作用,我假设是因为路径c:\ test.zip \ project.zip不是有效路径。

为了清晰起见编辑:我真的希望压缩一些文件并将该zip放在另一个存档中。它必须使用System.IO.Compression,没有第三方方法。

根据我的理解,你必须为zip文件创建一个目标地址,而且根据我的经验,目标地址不能是无效的路径,例如“c:\ test.zip \ project.zip”

1 个答案:

答案 0 :(得分:2)

最简单的方法是在包含projectDirectoryPath内容的临时文件中创建您的zip文件,一旦完成,您将该文件添加到目标zip存档。

所以基本上是这样的:

var projectDirectoryPath = currentProjectViewModel.DirectoryPath;
var tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
try
{
    ZipFile.CreateFromDirectory(projectDirectoryPath, tempFile);

    using (var archive = ZipFile.Open(TargetFilePath, ZipArchiveMode.Update))
    {
        archive.CreateEntryFromFile(tempFile, "Project.zip", CompressionLevel.NoCompression);
    }
}
finally
{
    System.IO.File.Delete(tempFile);
}

我建议您使用CompressionLevel.NoCompression,因为zip存档已经被压缩,另一层压缩将不会添加任何值。打开存档时使用ZipArchiveMode.Update很重要,因此zip文件实际上已被更改。此枚举器的其他值用于从头开始创建新存档或以只读方式打开它。

在示例中,我使用了CreateEntryFromFile函数。它是一种扩展方法,因此请确保在using声明中包含命名空间。

可以以某种方式实现这一点,因此不需要临时文件,但需要更多代码,因为您必须自己创建新的zip文件并将其直接写入创建新文件时获得的流在achive中输入。但对于大多数情况,我给出的例子应该可以胜任。