如何覆盖现有的zip文件?

时间:2015-01-27 21:31:39

标签: c# .net

我已经使用以下实用程序方法来压缩解决方案中的文件。我的印象是,当它生成一个与现有存档具有相同名称的.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);
    }
}

我缺少一个布尔覆盖参数,或者我是否需要写一个支票来删除一个同名的预先存在的档案?

3 个答案:

答案 0 :(得分:8)

请参阅ZipFile.Open文档中的备注:

  

将mode参数设置为Create时,将使用FileMode.CreateNew作为文件模式值打开存档。如果存档已存在,则抛出IOException。   将mode参数设置为Update时,将使用FileMode.OpenOrCreate作为文件模式值打开存档。如果存档存在,则会打开它。可以修改现有条目,并可以创建新条目。如果存档不存在,则创建新存档;但是,在“更新”模式下创建zip存档的效率不如在“创建”模式下创建它。

所以问题在于底层的文件处理。当您使用Create作为ZipArchiveMode时,API会隐式尝试创建文件而不处理其已存在的文件。在您的情况下,Update ZipArchiveMode可能更合适。 FileMode enumeration详细介绍了上述每个值允许和要求的内容。

话虽如此,如果您希望替换现有存档而不是更改其内容,如果存在,则需要check for its existencedelete 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}");
    }
}

希望有帮助。