Question

Dans une application de cacao de la mine, il existe une méthode qui fait des opérations sur un schéma de base de données SQLite qui pourrait être destructrice, donc d'abord nous faire une copie de restauration de la base de données, et s'il y a une erreur, nous appelons la méthode suivante pour remplacer le fichier db avec le fichier de restauration. Notez que je veux vraiment le fichier db remplacé par le rollback!

- (BOOL)restoreDatabaseFromFileAtPath:(NSString *)backupPath error:(NSError **)error {
    NSFileManager *fm = [NSFileManager defaultManager];
    // get the db paths
    NSString *databasePath = [sharedManager pathToDatabase];

    // insist that the two files be present
    NSAssert1([fm fileExistsAtPath:databasePath], @"no db file at %@", databasePath);
    NSAssert1([fm fileExistsAtPath:backupPath], @"no backup db file at %@", backupPath);

    // remove the original to make way for the backup
    NSLog(@"removing the file at the primary database path...");
    if ([fm removeItemAtPath:databasePath error:error]) {
        // now move the backup to the original location
        NSLog(@"moving the backup file into the primary database path...");
        if ([fm moveItemAtPath:backupPath toPath:databasePath error:error]) {
            return YES;
        }
    }
    [self presentError:error]; // at this point we're in real trouble
    return NO;
}

Le code ci fonctionne, mais il est potentiellement très destructeur et pas exactement atomique. Ce que je voudrais vraiment faire est quelque chose que j'imagine existe, mais je ne peux pas trouver un moyen de le faire dans l'API pour NSFileManager, quelque chose comme:

Bool success = [fm moveFileAtPath:backupPath toPath:databasePath overwriteDestination:YESPLZ error:&error];

La méthode qui se rapproche le plus de ce vomit quand il découvre qu'il ya déjà un fichier sur le chemin de destination.

Petite mise à jour en fonction des réponses à ce jour:

Il doit y avoir une manière standard ce qui a toujours été fait par Cocoa devs, pour remplacer atomiquement un fichier. Les différentes méthodes de « déplacement » de NSFileManager ne fournissent pas une installation pour cette sortie de la boîte. En outre, la recherche de soutien et 10,5 dans cette lib ainsi que l'iPhone OS 3 +.

Était-ce utile?

Autres conseils

Que diriez-vous de NSFileManager de replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:?

Voir la documentation

Je vous suggère les fonctions FSExchangeObjects, PBExchangeObjectsSync ou PBExchangeObjectsAsync, car ils échangent en fait le contenu de deux fichiers atomiquement.

De bibliothèque de développement :

  

La fonction permet aux programmes de   mettre en œuvre une opération de « sauvegarde sécurisée » par   la création et la rédaction d'un nouveau complet   déposer et échanger le contenu.

     

Après l'échange, le chemin d'accès   se référer aux données du fichier en face   (Qui est, pour les mêmes données, il   visé à l'origine, qui fait maintenant partie   de l'autre fichier).

     

Disponible sous Mac OS X v10.0 et versions ultérieures.

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