NSDocumentにファイルを保存するのはなぜ名前の奇妙な文字を持つ同じファイルのバージョンを作成しますか?

StackOverflow https://stackoverflow.com//questions/22046035

質問

文書タイプが束のファイルを含むパッケージバンドルである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」をいくつかの内容で保存します。

今、問題。実際にディスクに保存されているものを見ると、これが表示されます。

screenshot

ファイルを保存するたびに、NSDocumentラッパーはリソースのバージョン管理されたコピーを作成するようです。バージョン管理されたクローンを望んでいません。最新のコンテンツを使用してバニラファイルだけが必要です。

バージョン管理されたリソースはどこから来たのですか?何が起きてる?DOCが読んでいるべきですか?

役に立ちましたか?

解決

OK、私はそれを考え出したと思います。それが判明しているので、実際にはバージョン管理の問題ではありませんでした。たびに新しいファイルを追加するだけであるようです。まず、いくつかのノート。

  1. パッケージ内のファイルを作成しないように見えますが、パッケージ内の「ファイルを含むディレクトリ」。あなたがしようとしていることは何ですか?
  2. ディレクトリ "default"が存在しないように見え、ディレクトリ "somefile.ext"を作成して使用します。これは、次回奇妙なプレフィックスを持つ新しいディレクトリを作成することを意味します。ただし、私はあなたのスクリーンショットからあなたがすでにディレクトリ "デフォルト"を持っていることを見ます、それはこれがあなたの問題ではありません。
  3. 今、あなたの実際の問題:このドキュメント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. あなたが意図した疑いのあるように、defaultWrapperの希望のファイル名を「デフォルト」に変更しました。
    2. 私は存在する場合、以前に保存されたファイルを削除するifブロックを追加しました。
    3. 次回#2の次回の使用のために、新しいNSFileWrapperのファイル名を保存しました。
    4. これらの変更の後、プログラムはあなたが予想する動作であると思うものを示しました:複数回保存した後でさえ1つのファイルを含む1つのディレクトリ。 preservesVersionsYESを返しても、これは当てはまりました。私はそれがそのバージョンを保存する場所がわかりませんが、私はそれらを見ませんでした。

他のヒント

実装することができます。-WriteTourlに直接呼び出すように:... -WritetOurl:...が-fileWrapPeroFtype:...を呼び出してから、それをURL Atom>

に書き込みます。

すき。NSFileWrapperを実行させることで、アトミック節約に対する責任を引き継いだろう。そのように、ラッパーはファイルが本当に終わる場所をきれいに追跡する必要があります。

source

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top