Perché il salvataggio dei file in un nsdocument crea versioni dello stesso file con strani caratteri nel loro nome?

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

Domanda

Sto lavorando su un'applicazione basata su NSDocument il cui tipo di documento è un pacchetto di pacchetti che contiene un mucchio di file.Lo sto salvando così:

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

In altre parole, nel bundle, creare una cartella "predefinita" e salva "Somefile.ext" in esso con alcuni contenuti.

Ora, il problema.Quando vado a guardare cosa è effettivamente salvato su disco, vedo questo:

screenshot

Ogni volta che salvo il file, il wrapper NSDocument sembra creare qualche copia con versione della risorsa.Non voglio i cloni di versioni, voglio solo il file vaniglia con il più recente contenuto.

Da dove vengono le risorse di versioni?Cosa sta succedendo qui?C'è un DOC che dovrei leggere?

È stato utile?

Soluzione

OK, penso di averlo capito. Come si scopre, non era in realtà un problema di versioni. Sembra che tu stia semplicemente aggiungendo un nuovo file ogni volta. Innanzitutto, alcune note.

    .
  1. Si sembrano non creare un file in un pacchetto, ma una "directory contenente un file", in un pacchetto. È quello che intendevi fare?
  2. Sembra che se la directory "default" non esistesse, si crea e utilizza una directory "somefile.ext", il che significa che la prossima volta crea una nuova directory con un prefisso strano. Tuttavia, vedo dal tuo screenshot che hai già una directory "predefinita", il che significa che questo non è il tuo problema.
  3. Ora, il tuo problema effettivo: secondo Questa documentazione , addRegularFileWithContents crea un nuovo file con il file preferito, a meno che la directory (defaultWrapper) Contiene già un file con quel nome (fondamentalmente). Se c'è già, crea un nuovo file con un prefisso. addRegularFileWithContents restituisce una stringa identificativa che si riferisce al nsfilewrapper creato (penso che sia il nome del file).

    Allora, cosa sta succedendo è che ogni volta che vai a salvare il file, vede che c'è già un file di quel nome e crea un nuovo prefissato. Un modo per risolvere questo è quello di mantenere il NSString restituito da addRegularFileWithContents, quindi quando si va per salvarti controllare il defaultWrapper e rimuovere il NSFileWrapper associato allo stored NSString, se ce ne è uno, quindi aggiungere il file come normale. Ho modificato il tuo codice come segue:

    @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. Ho cambiato il nome file preferito del defaultWrapper per essere "predefinito", mentre sospetto che tu abbia inteso.
    2. Ho aggiunto un blocco if che rimuove il file precedentemente salvato, se esistesse.
    3. Ne ho fatto riporre il nuovo nome file NSFileWrapper, per l'uso la prossima volta in # 2.
    4. Dopo queste modifiche, il programma ha dimostrato ciò che penso sia il comportamento che ti aspetti: una directory contenente un file, anche dopo aver salvato più volte. Si noti che questo è stato vero anche quando preservesVersions restituito YESTagCode. Non sono sicuro di dove memorizza le sue versioni, ma non li ho visti.

Altri suggerimenti

Potresti implementare -scritaAfely ... in modo che richiama dritto a -writetourl: ... Implementare -writetourl: ... in modo che chiama -FileWrapperoftype: ... e poi scrive questo all'URL atomicamente

I.e.Assumerai la responsabilità della responsabilità per i salvataggi atomici facendo sì che nsfilewrapper lo faccia.In questo modo il wrapper dovrebbe tracciare ordinatamente dove i file finiscono davvero.

sorgente .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top