如何在编写文件

时间:2015-06-19 17:02:59

标签: ios objective-c memory nsfilemanager nsfilewrapper

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

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

以下是备份文件的当前文件结构:

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

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

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

1 个答案:

答案 0 :(得分:3)

NSFileWrapper树写入磁盘时,它会尝试将原始文件的硬链接执行到新位置,但前提是您为originalContentsURL提供参数。

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

因此,如果您需要硬链接行为,则需要找到提供originalContentsURL的方法。通过向初始writeToURL电话提供适当的网址,可以轻松完成此操作。

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