¿Por qué guardar archivos en un NSDocument crea versiones del mismo archivo con caracteres extraños en su nombre?

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

Pregunta

Estoy trabajando en una aplicación basada en NSDocument cuyo tipo de documento es un paquete que contiene un montón de archivos.Lo guardo así:

- (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 otras palabras, en el paquete, cree una carpeta "predeterminada" y guarde en ella "algún archivo.ext" con algunos contenidos.

Ahora, el problema.Cuando miro lo que realmente está guardado en el disco, veo esto:

screenshot

Cada vez que guardo el archivo, el contenedor NSDocument parece crear una copia versionada del recurso.No quiero los clones versionados, solo quiero el archivo básico con el contenido más reciente.

¿De dónde provienen los recursos versionados?¿Que está pasando aqui?¿Hay algún documento que debería leer?

¿Fue útil?

Solución

Ok, creo que lo descubrí.Resulta que en realidad no fue un problema de versiones.Parece que simplemente estabas agregando un archivo nuevo cada vez.Primero, algunas notas.

  1. Parece que no está creando un archivo en un paquete, sino un 'directorio que contiene un archivo', en un paquete.¿Es eso lo que pretendías hacer?
  2. Parece que si el directorio "predeterminado" no existe, crea y usa un directorio "someFile.ext", lo que significa que la próxima vez creará un nuevo directorio con un prefijo extraño.Sin embargo, veo en tu captura de pantalla que ya tienes un directorio "predeterminado", lo que significa que este no es tu problema.

Ahora, tu problema real:de acuerdo a esta documentación, addRegularFileWithContents crea un nuevo archivo con su nombre de archivo preferido, a menos que El directorio (defaultWrapper) ya contiene un archivo con ese nombre (básicamente).Si ya lo hay, crea un nuevo archivo con un prefijo. addRegularFileWithContents devuelve una cadena de identificación que hace referencia al NSFileWrapper creado (creo que es el nombre del archivo).

Entonces, lo que sucede es que cada vez que vas a guardar el archivo, ve que ya existe un archivo con ese nombre y crea uno nuevo con el prefijo.Una forma de resolver esto es mantener el NSString devuelto por addRegularFileWithContents, luego cuando vayas a guardar marca el defaultWrapper y elimine el NSFileWrapper asociado con el NSString almacenado, si lo hay, y luego agregue el archivo como de costumbre.He modificado su código de la siguiente manera:

@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. he cambiado el defaultWrapperEl nombre de archivo preferido es "predeterminado", como sospecho que pretendías.
  2. He agregado un if bloque que elimina el archivo previamente guardado, si existiera.
  3. Le pedí que almacenara el nombre de archivo del nuevo NSFileWrapper, para usarlo la próxima vez en el n.° 2.

Después de estos cambios, el programa demostró lo que creo que es el comportamiento esperado:un directorio que contiene un archivo, incluso después de guardarlo varias veces.Tenga en cuenta que esto era cierto incluso cuando preservesVersions regresó YES.No estoy seguro de dónde almacena sus versiones, pero no las vi.

Otros consejos

Podrías implementar "escribitesafely ... para que se llame directamente a través de" " Implementar -WritEtourl: ... para que llame -FileWrapPerofType: ... y luego lo escribe a la URL ATOMICAMENTE

es.Usted estaría asumiendo la responsabilidad de los salvados atómicos haciendo que NSFileWrapper lo haga.De esa manera, la envoltura debe rastrear perfectamente a dónde terminan los archivos.

fuente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top