2

ファイルを書き込む一部の関数はアトミックであるため、書き込み時に何かが発生した場合にファイルの破損を防ぐという意味で非常に便利です。

-[NSData writeToFile:atomically:]
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

問題は、彼らがファイルを消去して新しいコンテンツに置き換えることです...そして、巨大なファイルに 1 行を追加するだけで済みます。

何かが起こった場合にそのファイルを破損する危険を冒さずに、アトミックな方法でそれを行う最良の方法は何ですか?

PS: ファイルが大きすぎて 1 つの文字列で読み取ることができず、文字列を更新してから、巨大な文字列をファイル システムにプッシュします。

前もって感謝します。

4

3 に答える 3

5

そのような機能がない理由は、アトミック バージョンがファイルのコピーを作成し、すべてをそれに書き込み、新しいファイルの名前を古いファイルと同じ名前に変更し、最後に古いファイルを削除するためです。そのため、元のファイルは実際には変更されず、新しいファイルに置き換えられます。

高速なアトミックな追加が必要な場合は、 and を使用fwritefsyncて達成した効果を得ることができます。fwritePIPE_BUF (iOS では 4096 バイト) 未満の s は、fsyncアトミックであることが保証されています。

以下は、操作を実行するカテゴリの短いスニペットです。syscall の適切なエラー チェック コードが欠落していることに注意してください。

@implementation NSData(AppendAtomically)

- (void)appendToFileAtomic:(NSString *)filePath
{
    NSAssert([self length] < PIPE_BUF, @"Cannot write messages longer than %d atomically", PIPE_BUF);

    const char *utfpath = [filePath UTF8String]; 

    FILE *f = fopen(utfpath, "ab");
    fwrite([self bytes], 1, [self length], f);
    fsync(fileno(f));
    fclose(f);
}

@end
于 2012-05-17T13:03:56.880 に答える
0

ここに示されている方法が1つあり、このスタックオーバーフローの質問も同様に示されています。

それを行う2番目の方法は次のとおりです。

ファイルからデータを取得する

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

ファイルがハッジであるため、最初のファイルの方が適しています。

お役に立てれば :)

于 2012-05-17T12:48:33.780 に答える
0

をご覧くださいNSFileHandle。書き込み用にファイルを開き、カーソルをファイルの最後までシークし、ファイルの最後にデータを追加することができます。

于 2012-05-17T13:25:18.720 に答える