2

を使用してファイル パッケージを保存する最も効率的な方法を見つけようとしていますNSFileWrapper

ファイル ラッパーを保存するときは、アトミックな書き込みを使用せず、前のコンテンツの URL を渡します。

ただし、2 回目の書き込みは常に次のエラーで失敗します

NSError *error;
[wrapper writeToURL:fileURL options:0 originalContentsURL:fileURL error:&error];
STAssertNil(error, @""); // First time works (new file)

// Write a second time without changes
[wrapper writeToURL:fileURL options:0 originalContentsURL:fileURL error:&error];
STAssertNil(error, @""); // Fails with error 516, file already exists

もちろん、ファイルは 2 回目に存在します。2 回目に保存するからです。私が期待するのは、内容が変更されていないため、実際に何も書き出さなくても保存が成功することです。

上記のコードは flag を使用すると機能しNSFileWrapperWritingAtomicますが、これは最初に内容全体を一時ファイルに書き込むことになります。これは避けたいことです。ファイルのハードリンクを使用して書き込みを行ったとしても、ファイルパッケージ内のディレクトリが変更され、他の副作用が発生します (実際にはファイルは変更されず、ディレクトリ inode のみが変更されますが、iCloud レポートは変更されます)。

ファイルラッパーが既存のファイルを非アトミックに単純に上書きするためのフラグのようなものはありませんか?

4

1 に答える 1

0

NSDocument の安全な保存を複製して、そのフラグを使用せずに、必要なことを行うことができます。NSFileManager のreplaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:を使用して一時ファイルを元の URL に移動するよりも、最初に一時ファイルに書き込みます (これは変更されたファイルのみを書き込み、他のすべてをハードリンクします) 。

于 2014-02-11T23:31:44.847 に答える