正如标题所说,我正试图在拉链内创建一个拉链。
我在名为“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”
答案 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
中输入。但对于大多数情况,我给出的例子应该可以胜任。