NSDocumentにファイルを保存するのはなぜ名前の奇妙な文字を持つ同じファイルのバージョンを作成しますか?
-
21-12-2019 - |
質問
文書タイプが束のファイルを含むパッケージバンドルであるNSDocumentベースのアプリケーションに取り組んでいます。私はそれを保存しています:
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError
{
if (!self.documentFileWrapper) {
NSFileWrapper *documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
[self setDocumentFileWrapper:documentFileWrapper];
}
NSFileWrapper *defaultWrapper = [self.documentFileWrapper.fileWrappers objectForKey:@"default"];
if (!defaultWrapper) {
defaultWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
[defaultWrapper setPreferredFilename:@"someFile.ext"];
[self.documentFileWrapper addFileWrapper:defaultWrapper];
}
[defaultWrapper addRegularFileWithContents: ... some computed content for the file ... preferredFilename:@"someFile.ext"];
return self.documentFileWrapper;
}
.
換言すれば、バンドルに「デフォルト」フォルダを作成し、「somefile.ext」をいくつかの内容で保存します。
今、問題。実際にディスクに保存されているものを見ると、これが表示されます。
ファイルを保存するたびに、NSDocumentラッパーはリソースのバージョン管理されたコピーを作成するようです。バージョン管理されたクローンを望んでいません。最新のコンテンツを使用してバニラファイルだけが必要です。
バージョン管理されたリソースはどこから来たのですか?何が起きてる?DOCが読んでいるべきですか?
解決
OK、私はそれを考え出したと思います。それが判明しているので、実際にはバージョン管理の問題ではありませんでした。たびに新しいファイルを追加するだけであるようです。まず、いくつかのノート。
- パッケージ内のファイルを作成しないように見えますが、パッケージ内の「ファイルを含むディレクトリ」。あなたがしようとしていることは何ですか?
- ディレクトリ "default"が存在しないように見え、ディレクトリ "somefile.ext"を作成して使用します。これは、次回奇妙なプレフィックスを持つ新しいディレクトリを作成することを意味します。ただし、私はあなたのスクリーンショットからあなたがすでにディレクトリ "デフォルト"を持っていることを見ます、それはこれがあなたの問題ではありません。
- あなたが意図した疑いのあるように、
defaultWrapper
の希望のファイル名を「デフォルト」に変更しました。 - 私は存在する場合、以前に保存されたファイルを削除する
if
ブロックを追加しました。 - 次回#2の次回の使用のために、新しいNSFileWrapperのファイル名を保存しました。
今、あなたの実際の問題:このドキュメント、addRegularFileWithContents
は、既存のファイル名を持つ新しいファイルを作成します。(defaultWrapper
) (基本的に)その名前のファイルがすでに含まれています。すでにある場合は、接頭辞を持つ新しいファイルを作成します。 addRegularFileWithContents
は、作成されたNSFileWrapperを参照して識別文字列を返します(私はファイル名だと思います)。
それで、何が起こっているのかは、ファイルを保存するたびに、その名前のファイルがすでにファイルがあることを確認し、新しいプレフィックスを作成します。これを解決する1つの方法は、NSStringをaddRegularFileWithContents
から返して保存するときに、defaultWrapper
をチェックし、保存されているNSStringに関連付けられているNSFileWrapperを削除し、1つがある場合はNORMALのようなファイルを追加します。コードを次のように変更しました。
@interface TestDocument () // Relevant part of my test class. Note `wrapperFileName`.
@property (nonatomic, strong) NSFileWrapper *documentFileWrapper;
@property (nonatomic, strong) NSString *wrapperFileName;
@end
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError
{
if (!self.documentFileWrapper) {
NSFileWrapper *documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
[self setDocumentFileWrapper:documentFileWrapper];
}
NSFileWrapper *defaultWrapper = [self.documentFileWrapper.fileWrappers objectForKey:@"default"];
if (!defaultWrapper) {
defaultWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
[defaultWrapper setPreferredFilename:@"default"];
[self.documentFileWrapper addFileWrapper:defaultWrapper];
} else if (self.wrapperFileName) {
[defaultWrapper removeFileWrapper:[[defaultWrapper fileWrappers] objectForKey:self.wrapperFileName]];
}
self.wrapperFileName = [defaultWrapper addRegularFileWithContents:[@"blah blah" dataUsingEncoding:NSUTF8StringEncoding] preferredFilename:@"someFile.txt"];
return self.documentFileWrapper;
}
.
これらの変更の後、プログラムはあなたが予想する動作であると思うものを示しました:複数回保存した後でさえ1つのファイルを含む1つのディレクトリ。 preservesVersions
がYES
を返しても、これは当てはまりました。私はそれがそのバージョンを保存する場所がわかりませんが、私はそれらを見ませんでした。
他のヒント
実装することができます。-WriteTourlに直接呼び出すように:... -WritetOurl:...が-fileWrapPeroFtype:...を呼び出してから、それをURL Atom>
に書き込みます。すき。NSFileWrapperを実行させることで、アトミック節約に対する責任を引き継いだろう。そのように、ラッパーはファイルが本当に終わる場所をきれいに追跡する必要があります。