iPhone file corruption
Is it possible (on iPhone开发者_StackOverflow/iPod Touch) for a file written like this:
if (FILE* file = fopen(filename, "wb")) {
fwrite(buf, buf_size, 1, file);
fclose(file);
}
to get corrupted, e.g. when app is forced to terminate?
From what I know fwrite should be an atomic operation, so when I write whole file with one instruction no corruption should occure. I could not find any information on the net that would say otherwise.
Since when fwrite
is atomic? I can't find any references. Anyway, even if fwrite
can be atomic, the time between fopen
and fwrite
is not, so if your app is forced to terminate between those times, you'll get an empty file.
As you're writing for iPhoneOS, you can use -[NSData writeToFile:atomically:]
to ensure the whole open-write-close procedure is atomic (it works by writing to a temporary file, then replace the original one.)
You could make things easier for yourself and write the data using the NSData class that has a writeToFile:atomically:
method waiting for you. Wrapping the raw buffer with NSData
is not hard, there are the dataWithBytes:length
or dataWithBytesNoCopy:length:freeWhenDone:
initializers.
Data written with fwrite
is buffered. So a sudden termination might not flush the buffers. fclose
will flush the buffer but this does not implicate that the bytes are also written to the disk (due to OS level caches) AFAIK.
精彩评论