Zip文件:我能否重命名或移动Zip文件中的ZipArchiveEntry?

10

.NET ZipArchive允许重命名或移动条目吗?当前无法更改ZipArchiveEntry的名称。似乎我需要将原始ZipArchiveEntry的流复制到一个具有更改名称的新ZipArchiveEntry。

谢谢 马丁

1个回答

9
我不知道“移动”除了重命名条目之外还有什么意思。即使是在常规磁盘文件系统中,“移动”实际上只是重命名,其中文件名的完整路径已更改,而不仅仅是“叶节点”文件名。在.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);

谢谢,彼得。我期望这个结果。我只是希望可能有一些更优雅的方法来避免复制数据。但如果没有的话,这个解决方案对我来说也可以。 - msedi
@MdAslam:如果你的Close()调用没有立即返回,那么你就有一个bug。示例代码是无法帮助你的。你需要调试代码,或者发布一个新的问题来寻求帮助(确保提供一个好的[mcve])。 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接