【问题标题】:How to replace a file inside a zip on iOS?如何在 iOS 上替换 zip 中的文件?
【发布时间】:2013-07-12 23:33:38
【问题描述】:

我需要使用 iOS 替换 zip 上的文件。我尝试了许多库,但没有结果。唯一能做到这一点的是 zipzap (https://github.com/pixelglow/zipzap) 但这对我没有好处,因为真正要做的是重新压缩文件并进行更改,此外这个过程对我来说会变慢,还做一些将整个文件加载到内存中并使我的应用程序崩溃的事情。

PS:如果这不可能或太复杂,我可以解决重命名或删除特定文件。

【问题讨论】:

  • 不可能。 ZIP 本身的想法是将整个部分维护为单个文件。即使从这个意义上说,如果您想更改其中的某些部分,您需要打开它,进行更改并再次保存。您应该考虑的其他选项是您在压缩文件时使用了哪种压缩方式?
  • 当您说“您需要打开它,进行更改并再次保存”时,您的意思是什么,因为这正是我需要做的。我的问题是我不想解压缩和压缩整个 zip 文件进行一次更改。为了回答您的问题,如果您所说的“压缩类型”是指 zip、gzip、bzip 等,我在这里没有选择,它必须是 zip。感谢您的回复。

标签: iphone ios objective-c zip


【解决方案1】:

您需要找到一个框架,您可以在其中修改数据的读取和写入方式。然后,您将使用某种形式的 mmap 来读取和写入小块。在 NSData 和 mmap 上搜索得到了这个Post,但是您也可以从 posix 级别使用 mmap。 Ps 它会比使用纯内存慢。

【讨论】:

  • 您好,感谢您的回复。我不明白如何将其与 zip 文件联系起来。 ZIP 文件不仅仅是数据,因为它需要对 ZIP 中的每个文件进行描述和压缩。我会很感激你的帮助。谢谢。
  • 没有理由任何 ZIP 软件都需要先在内存中读入或创建文件。很有可能在创建 ZIP 数据时、逐个文件或在解压缩阶段写入 ZIP 数据。使用 MMAP 是实现此目的的方法 - 软件获取指针并进行读写,系统管理各种页面。但是,它不是您可以轻松添加到已经将所有内容读入内存的代码中的东西。所以我的观点是,有人可以正确地做到这一点,以便可以处理非常大的文件。现在你必须找到开源的人。
【解决方案2】:

搞定了!! JXZip (https://github.com/JanX2/JXZip) 正是我所需要的,它们链接到 libzip (http://www.nih.at/libzip/),这是一个用于处理 ZIP 文件的设备齐全的库,并且 JXZip 具有所有必要的 Objective-C 包装代码。谢谢大家的回复。

【讨论】:

    【解决方案3】:

    出于存档目的,作为zipzap的作者:

    实际上 zipzap 完全符合您的要求。如果您替换 zip 文件中的条目,zipzap 将做最少的必要更新:它会跳过写入替换条目之前的所有条目,然后写出该条目,然后在不重新压缩的情况下写出替换条目之后的所有条目。目前,它确实需要足够的内存来存储替换条目之后的条目。

    【讨论】:

    • 我最近修复了最后一个问题:zipzap 现在不需要额外的内存来存储替换条目之后的条目。
    猜你喜欢
    • 2016-09-07
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多