我已经使用以下实用程序方法来压缩解决方案中的文件。我的印象是,当它生成一个与现有存档具有相同名称的.zip存档时,它会覆盖它。这似乎并不是这种情况,并且抛出一个异常,说明该文件已经存在。
public static void CompressFile(string zipName, string filePath, string fileName)
{
try
{
using (ZipArchive archive = ZipFile.Open(zipName, ZipArchiveMode.Create))
{
archive.CreateEntryFromFile(filePath, fileName, CompressionLevel.Fastest);
}
}
catch(Exception e)
{
_log.Error("Exception Caught: {0}", e.Message);
}
}
我缺少一个布尔覆盖参数,或者我是否需要写一个支票来删除一个同名的预先存在的档案?
答案 0 :(得分:8)
请参阅ZipFile.Open文档中的备注:
将mode参数设置为Create时,将使用FileMode.CreateNew作为文件模式值打开存档。如果存档已存在,则抛出IOException。 将mode参数设置为Update时,将使用FileMode.OpenOrCreate作为文件模式值打开存档。如果存档存在,则会打开它。可以修改现有条目,并可以创建新条目。如果存档不存在,则创建新存档;但是,在“更新”模式下创建zip存档的效率不如在“创建”模式下创建它。
所以问题在于底层的文件处理。当您使用Create
作为ZipArchiveMode时,API会隐式尝试创建文件而不处理其已存在的文件。在您的情况下,Update
ZipArchiveMode可能更合适。 FileMode enumeration详细介绍了上述每个值允许和要求的内容。
话虽如此,如果您希望替换现有存档而不是更改其内容,如果存在,则需要check for its existence和delete it才能打开以Create
模式存档。
答案 1 :(得分:2)
简单 - 在写入之前删除zip。如果它之前没有存在 - 没有伤害。
为了安全起见,您还可以先创建新的,然后使用force命令将其移到旧的上面。
根据:https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx
ZipArchive.Open将新文件添加到现有的zip存档中。务必阅读文档以确保使用正确的方法!
森
答案 2 :(得分:0)
正如@Dan J在他的回答中提到的那样,您要做的就是检查文件是否存在,如果没有必要将其删除,然后创建它。下面给出了有效的代码段。
private void ZipTheFolder() {
try {
if (File.Exists(ZipPath)) {
File.Delete(ZipPath);
}
ZipFile.CreateFromDirectory(FolderFromZipLocation, ZipPath);
}
catch(Exception ex) {
throw new CustomConfigurationException($ "Error when zip: {ex.Message}");
}
}
希望有帮助。