Pourquoi l'enregistrement de fichiers dans un NSDocument crée-t-il des versions du même fichier avec des caractères étranges dans leur nom ?

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

Question

Je travaille sur une application basée sur NSDocument dont le type de document est un ensemble de packages contenant un ensemble de fichiers.Je le sauvegarde ainsi :

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

En d’autres termes, dans le bundle, créez un dossier « par défaut » et enregistrez-y « someFile.ext » avec du contenu.

Maintenant, le problème.Quand je regarde ce qui est réellement enregistré sur le disque, je vois ceci :

screenshot

Chaque fois que j'enregistre le fichier, le wrapper NSDocument semble créer une copie versionnée de la ressource.Je ne veux pas de clones versionnés, je veux seulement le fichier vanilla avec le dernier contenu.

D’où proviennent les ressources versionnées ?Que se passe t-il ici?Y a-t-il un doc que je devrais lire ?

Était-ce utile?

La solution

Ok, je pense que j'ai compris.Il s’avère qu’il ne s’agissait pas réellement d’un problème de version.Il semble que vous ajoutiez simplement un nouveau fichier à chaque fois.Tout d’abord, quelques notes.

  1. Vous semblez ne pas créer de fichier dans un package, mais un « répertoire contenant un fichier » dans un package.Est-ce que c'est ce que vous aviez l'intention de faire ?
  2. Il semble que si le répertoire "default" n'existe pas, vous créez et utilisez un répertoire "someFile.ext", ce qui signifie que la prochaine fois, il créera un nouveau répertoire avec un préfixe étrange.Cependant, je vois sur votre capture d'écran que vous disposez déjà d'un répertoire "par défaut", ce qui signifie que ce n'est pas votre problème.

Maintenant, votre vrai problème :selon ce document, addRegularFileWithContents crée un nouveau fichier avec votre nom de fichier préféré, sauf si le répertoire (defaultWrapper) contient déjà un fichier portant ce nom (en gros).S'il y en a déjà un, il crée un nouveau fichier avec un préfixe. addRegularFileWithContents renvoie une chaîne d'identification faisant référence au NSFileWrapper créé (je pense que c'est le nom du fichier).

Donc, ce qui se passe, c'est que chaque fois que vous enregistrez le fichier, il voit qu'il existe déjà un fichier de ce nom et en crée un nouveau avec préfixe.Une façon de résoudre ce problème consiste à conserver la NSString renvoyée par addRegularFileWithContents, puis lorsque vous sauvegardez, vérifiez le defaultWrapper et supprimez le NSFileWrapper associé au NSString stocké, s'il y en a un, puis ajoutez le fichier comme d'habitude.J'ai modifié votre code comme suit :

@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. j'ai changé le defaultWrapperLe nom de fichier préféré de est "par défaut", comme je suppose que vous le vouliez.
  2. J'ai ajouté un if bloc qui supprime le fichier précédemment enregistré, s'il existait.
  3. Je l'ai fait stocker le nom de fichier du nouveau NSFileWrapper, pour une utilisation la prochaine fois dans #2.

Après ces changements, le programme a démontré ce que je pense être le comportement que vous attendez :un répertoire contenant un fichier, même après avoir enregistré plusieurs fois.Notez que cela était vrai même lorsque preservesVersions revenu YES.Je ne sais pas où il stocke ses versions, mais je ne les ai pas vues.

Autres conseils

Vous pouvez implémenter -writesafly ... pour que cela appelle directement à --writTourl: ... Implément -writtourl: ... de sorte que cela appelle -filewrapperoftype: ... puis écrit que sur l'URL atomiquement

I.e.Vous entameriez la responsabilité des économies atomiques en faisant NsfileWrapper le faire.De cette façon, l'emballage doit suivre de manière proprement la suivi là où les fichiers se retrouvent vraiment.

source

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top