3

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

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

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

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

同样,请不要告诉我压缩我的音频文件。那只是对有缺陷的设计的创可贴。

似乎我可以将所有文件移动/复制到一个目录中NSFileManager,然后将该目录作为一个包。我应该走那条路吗?

4

1 回答 1

3

当一NSFileWrapper棵树被写入磁盘时,它将尝试将原始文件硬链接到新位置,但前提是您为originalContentsURL.

听起来您正在以编程方式构建文件包装器(用于备份场景),因此您的文件可能分散在整个文件系统中。这意味着当你 时,writeToURL没有. 这意味着硬链接逻辑将被跳过,文件将被加载,因此它可以被重写。originalContentsURL

因此,如果您想要硬链接行为,您需要找到一种方法来提供originalContentsURL. writeToURL这很容易通过为初始调用提供适当的 URL 来完成。

或者,您可以尝试NSFileWrapper对常规文件进行子类化,并为它们提供NSURL内部挂起的内容。您需要覆盖writeToURL以将此新 URL 传递到super,但该 URL 应该足以触发硬链接代码。然后,您希望将这个子类NSFileWrapper用于您想要硬链接的大文件。

于 2015-06-19T17:40:50.083 回答