iPhone文件损坏
是否可以(在iPhone/iPod Touch上)编写这样的文件:iPhone文件损坏,iphone,file,atomic,corruption,stdio,Iphone,File,Atomic,Corruption,Stdio,是否可以(在iPhone/iPod Touch上)编写这样的文件: if (FILE* file = fopen(filename, "wb")) { fwrite(buf, buf_size, 1, file); fclose(file); } 损坏,例如当应用程序被迫终止时 据我所知,fwrite应该是一个原子操作,所以当我用一条指令编写整个文件时,不应该发生损坏。我在网上找不到任何与此相反的信息。您可以让事情变得更简单,并使用具有writeToFile:atomical
if (FILE* file = fopen(filename, "wb")) {
fwrite(buf, buf_size, 1, file);
fclose(file);
}
损坏,例如当应用程序被迫终止时
据我所知,fwrite应该是一个原子操作,所以当我用一条指令编写整个文件时,不应该发生损坏。我在网上找不到任何与此相反的信息。您可以让事情变得更简单,并使用具有
writeToFile:atomicaly:
方法等待您的类来编写数据。用NSData
包装原始缓冲区并不难,有dataWithBytes:length
或datawithbytesnopy:length:freewwhendone:
初始化器。缓冲用fwrite
写入的数据。因此,突然终止可能不会刷新缓冲区fclose
将刷新缓冲区,但这并不意味着字节也会写入磁盘(由于操作系统级缓存)AFAIK 从何时起,fwrite
是原子的?我找不到任何推荐人。无论如何,即使fwrite
可以是原子的,但是fopen
和fwrite
之间的时间不是原子的,因此如果你的应用程序在这两个时间之间被迫终止,你会得到一个空文件
在编写iPhone操作系统时,您可以使用
-[NSData writeToFile:atomicaly://code>确保整个打开-写入-关闭过程是原子的(它通过写入临时文件,然后替换原始文件来工作)。fclose将刷新缓冲区,我错了吗?不刷新缓冲区不会损坏文件。fclose确实也会刷新缓冲区。@sfider:不刷新缓冲区会损坏文件。示例:假设缓冲区为512字节,数据为1200字节。fwrite将前1024个字节写入磁盘,其余176个字节保留在缓冲区中。因此,该文件不完整且可能已损坏。iPhoneOS源于Mac OS X,Mac OS X完全符合POSIX,POSIX标准要求C stdio file*操作是原子操作。然而,你是对的,如果福瑞特不会在fopen之后被调用,我可能会有腐败。我得检查一下。