编写文件的某些函数是原子的,因此在写入时会发生某些事情会阻止文件损坏的意义上非常方便。
-[NSData writeToFile:atomically:]
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
问题是他们擦除文件并用新内容替换它......我需要在一个巨大的文件中附加一行。
以原子方式执行此操作的最佳方法是什么,如果发生某种情况,不会冒着损坏该文件的风险?
PS:文件太大,无法在一个字符串中读取,更新字符串,然后将巨大的字符串推送到文件系统。
提前致谢。
答案 0 :(得分:5)
没有这样的功能的原因是因为原子版本制作文件的副本,将所有内容写入其中,然后将新文件重命名为与旧文件相同的名称,最后删除旧文件。因此,原始文件实际上从未被修改,而是被替换为新文件。
如果您想要快速的原子追加,可以使用fwrite
和fsync
来获得实现效果。低于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
。它将允许您打开文件进行写入,将光标搜索到文件的末尾,然后将数据附加到文件的末尾。