将NSString以原子方式附加到文件中?

时间:2012-05-17 12:39:06

标签: iphone objective-c file atomic

编写文件的某些函数是原子的,因此在写入时会发生某些事情会阻止文件损坏的意义上非常方便。

-[NSData writeToFile:atomically:]
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
问题是他们擦除文件并用新内容替换它......我需要在一个巨大的文件中附加一行。

以原子方式执行此操作的最佳方法是什么,如果发生某种情况,不会冒着损坏该文件的风险?

PS:文件太大,无法在一个字符串中读取,更新字符串,然后将巨大的字符串推送到文件系统。

提前致谢。

3 个答案:

答案 0 :(得分:5)

没有这样的功能的原因是因为原子版本制作文件的副本,将所有内容写入其中,然后将新文件重命名为与旧文件相同的名称,最后删除旧文件。因此,原始文件实际上从未被修改,而是被替换为新文件。

如果您想要快速的原子追加,可以使用fwritefsync来获得实现效果。低于PIPE_BUF(iOS上为4096字节)后跟fwrite的{​​{1}}保证是原子的。

以下是将执行操作的类别的简短代码段,请注意它错过了系统调用的正确错误检查代码。

fsync

答案 1 :(得分:0)

有一种方式显示here,此堆栈溢出question也显示类似。

第二种方法是:

从文件中获取数据

 NSMutable *data = [NSData dataWithContentsOfFile:yourFilePath];
 [data appendData:yourNewData];
 [data writeToFile:yourFilePath];

第一个更优选,因为文件是hudge。

希望这会有所帮助:)

答案 2 :(得分:0)

看看NSFileHandle。它将允许您打开文件进行写入,将光标搜索到文件的末尾,然后将数据附加到文件的末尾。