Warum werden beim Speichern von Dateien in einem NSDocument Versionen derselben Datei mit seltsamen Zeichen im Namen erstellt?

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

Frage

Ich arbeite an einer NSDocument-basierten Anwendung, deren Dokumenttyp ein Paketpaket ist, das eine Reihe von Dateien enthält.Ich speichere es so:

- (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;
}

Mit anderen Worten: Erstellen Sie im Bundle einen Ordner „default“ und speichern Sie „someFile.ext“ mit einigen Inhalten darin.

Nun, das Problem.Wenn ich mir ansehe, was tatsächlich auf der Festplatte gespeichert ist, sehe ich Folgendes:

screenshot

Jedes Mal, wenn ich die Datei speichere, scheint der NSDocument-Wrapper eine versionierte Kopie der Ressource zu erstellen.Ich möchte keine versionierten Klone, sondern nur die Vanilla-Datei mit dem neuesten Inhalt.

Woher kommen die versionierten Ressourcen?Was ist denn hier los?Gibt es ein Dokument, das ich lesen sollte?

War es hilfreich?

Lösung

Ok, ich glaube, ich habe es herausgefunden.Wie sich herausstellte, handelte es sich eigentlich nicht um ein Versionierungsproblem.Es scheint, dass Sie jedes Mal einfach eine neue Datei hinzugefügt haben.Zunächst ein paar Anmerkungen.

  1. Sie scheinen keine Datei in einem Paket zu erstellen, sondern ein „Verzeichnis, das eine Datei enthält“ in einem Paket.War das Ihre Absicht?
  2. Es scheint, dass Sie, wenn das Verzeichnis „default“ nicht existiert, ein Verzeichnis „someFile.ext“ erstellen und verwenden, was bedeutet, dass beim nächsten Mal ein neues Verzeichnis mit einem seltsamen Präfix erstellt wird.Allerdings sehe ich auf Ihrem Screenshot, dass Sie bereits ein Verzeichnis „default“ haben, was bedeutet, dass dies nicht Ihr Problem ist.

Nun zu Ihrem eigentlichen Problem:entsprechend dieser Dokumentation, addRegularFileWithContents erstellt eine neue Datei mit Ihrem bevorzugten Dateinamen, es sei denn das Verzeichnis (defaultWrapper) enthält (im Grunde) bereits eine Datei mit diesem Namen.Wenn dies bereits der Fall ist, wird eine neue Datei mit einem Präfix erstellt. addRegularFileWithContents gibt eine identifizierende Zeichenfolge zurück, die sich auf den erstellten NSFileWrapper bezieht (ich glaube, es ist der Dateiname).

Was also passiert, ist, dass jedes Mal, wenn Sie die Datei speichern, festgestellt wird, dass bereits eine Datei mit diesem Namen vorhanden ist, und eine neue Datei mit Präfix erstellt wird.Eine Möglichkeit, dieses Problem zu lösen, besteht darin, den von zurückgegebenen NSString beizubehalten addRegularFileWithContents, und wenn Sie dann zum Speichern gehen, überprüfen Sie das defaultWrapper und entfernen Sie den NSFileWrapper, der dem gespeicherten NSString zugeordnet ist, falls vorhanden, und fügen Sie dann die Datei wie gewohnt hinzu.Ich habe Ihren Code wie folgt geändert:

@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. Ich habe das geändert defaultWrapperDer bevorzugte Dateiname ist „Standard“, wie Sie es vermutlich beabsichtigt haben.
  2. Ich habe eine hinzugefügt if Block, der die zuvor gespeicherte Datei entfernt, falls vorhanden.
  3. Ich habe den Dateinamen des neuen NSFileWrapper für die nächste Verwendung in #2 speichern lassen.

Nach diesen Änderungen zeigte das Programm meiner Meinung nach das erwartete Verhalten:ein Verzeichnis mit einer Datei, auch nach mehrmaligem Speichern.Beachten Sie, dass dies auch damals der Fall war preservesVersions ist zurückgekommen YES.Ich bin nicht sicher, wo es seine Versionen speichert, aber ich habe sie nicht gesehen.

Andere Tipps

Sie könnten -schriftenfolie implementieren ... so, dass sie direkt nach -Writetourl anruft: ... Implementieren -WritetOurl: ... so, dass er -FilewRrapperoFType: ... und schreibt dann das auf die URL atomarisch

d. H.Sie würden die Verantwortung für Atomsparungen übernehmen, indem Sie nsFileWrapper machen.Auf diese Weise sollte der Wrapper ordentlich verfolgen, wo die Dateien wirklich enden.

Quelle

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top