如何避免 NSFileWrapper 在写入文件时使用大量内存

How can I avoid having NSFileWrapper use lots memory when writing the file

我有一个应用程序正在使用 NSFileWrapper 创建用户数据的备份。此备份文件包含文本和媒体文件(此处与压缩无关)。有时这些备份文件会变得非常大,超过 200 MB。当我调用 NSFileWrapper -writeToURL... 时,它似乎将整个内容加载到内存中作为写入过程的一部分。在旧设备上,这会导致我的应用程序由于内存限制而被系统终止。

有没有一种简单的方法可以避免 NSFileWrapper 将所有内容加载到内存中?我已经通读了这里我能找到的所有 NSFileWrapper 个问题。关于如何解决这个问题有什么建议吗?

这是备份文件的当前文件结构:

BackupContents.backupxyz user.txt - folder1 - audio files asdf.caf asdf2.caf - folder2 - audio files asdf3.caf

再次强调,请不要告诉我压缩我的音频文件。那只会是对有缺陷的设计的创可贴。

似乎我可以 move/copy 使用 NSFileManager 将所有文件放入一个目录,然后将该目录作为一个包。我应该走那条路吗?

NSFileWrapper 树被写入磁盘时,它会尝试将原始文件硬 link 到新位置,但前提是您为originalContentsURL

听起来您正在以编程方式构建文件包装器(用于备份方案),因此您的文件可能散布在整个文件系统中。这意味着当您 writeToURL 时,您 没有 originalContentsURL。这意味着 hard-link 逻辑将被跳过,文件将被加载以便重写。

因此,如果您想要硬 linking 行为,则需要找到一种方法来提供 originalContentsURL。通过向初始 writeToURL 调用提供适当的 URL 最容易做到这一点。

或者,您可以尝试对常规文件进行 NSFileWrapper 子类化,并为它们提供一个 NSURL 以便它们在内部保留。您需要覆盖 writeToURL 才能将这个新的 URL 传递到 super,但是 URL 应该足以触发硬 link 代码。然后,您希望将 NSFileWrapper 的这个子类用于您想要硬 link 放入的大文件。