Zip存档:我可以重命名或移动ZipArchiveEntry吗?

时间:2015-05-31 20:01:42

标签: c# .net zip

.NET ZipArchive是否允许重命名或移动条目?目前,一旦创建了ZipArchiveEntry,就无法更改它的名称。似乎我必须将原始ZipArchiveEntry的流复制到具有更改名称的新ZipArchiveEntry。

由于 马丁

1 个答案:

答案 0 :(得分:8)

我不知道“移动”是什么意思,除了重命名一个条目。即使在常规磁盘文件系统中,“移动”实际上只是一个重命名,其中文件名的完整路径已更改,而不仅仅是“叶节点”文件名。在.zip存档中,这更加明确;存档中的“目录”或“文件夹”仅通过其名称中具有该目录名的条目(当然,由目录分隔符分隔)存在。所以“移动”与“重命名”完全相同。


至于你是否可以使用ZipArchive来重命名,你必须创建一个新条目,它是原始文件的副本,但是使用新名称,然后删除原文。

执行此操作的代码如下所示:

static void RenameEntry(this ZipArchive archive, string oldName, string newName)
{
    ZipArchiveEntry oldEntry = archive.GetEntry(oldName),
        newEntry = archive.CreateEntry(newName);

    using (Stream oldStream = oldEntry.Open())
    using (Stream newStream = newEntry.Open())
    {
        oldStream.CopyTo(newStream);
    }

    oldEntry.Delete();
}

作为扩展方法实现,如上所述,您可以这样调用:

ZipArchive archive = ...; open archive in "update" mode
string oldName = ...,
    newName = ...; // names initialized as appropriate

archive.RenameEntry(oldName, newName);