iPhoneのファイル破損
-
21-09-2019 - |
質問
(iPhone/iPod Touch 上で) 次のように書かれたファイルを使用することは可能ですか:
if (FILE* file = fopen(filename, "wb")) {
fwrite(buf, buf_size, 1, file);
fclose(file);
}
破損する、例:アプリが強制終了されるときは?
私の知っているところによると、fwrite はアトミックな操作であるはずなので、1 つの命令でファイル全体を書き込むときに破損は発生しません。ネット上にはそれ以外の情報は見つかりませんでした。
解決
fwrite
がアトミックであるいつから?私はすべての参照を見つけることができません。とにかく、fwrite
は原子することができたとしても、fopen
とfwrite
の間の時間は、のないのアプリがこれらの時刻の間に終了することを余儀なくされている場合、そう、あなたは空のファイルを取得します。
はiPhoneOSのために、あなたしている書き込みとして、あなたは全体のオープン・ライト・クローズ手順がアトミックであることを確認するために-[NSData writeToFile:atomically:]
を使用することができます(それは、その後、元のものを置き換える一時ファイルに書き込むことで動作します。)
他のヒント
自分で作業を簡単にして、次のコマンドを使用してデータを書き込むこともできます。 NSデータ を持つクラスwriteToFile:atomically:
メソッドがあなたを待っています。生のバッファをラップする NSData
難しいことではありません。 dataWithBytes:length
または dataWithBytesNoCopy:length:freeWhenDone:
イニシャライザ。
fwrite
で書かれたデータがバッファリングされています。だから、突然の終了は、バッファをフラッシュしない場合があります。 fclose
はバッファをフラッシュしますが、これはバイトも私の知る限り(これはOSレベルのキャッシュに)ディスクに書き込まれていることを含意しません。