Comment puis-je déplacer en toute sécurité / fichiers d'échange à Cocoa?
-
21-09-2019 - |
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 +.
La solution
Le niveau C FSMoveObjectSync / les fonctions de FSMoveObjectAsync pourraient aider. Ces fonctions prennent un ensemble d'options, qui peuvent inclure un drapeau pour écraser destination, kFSFileOperationOverwrite
, entre autres.
Autres conseils
Que diriez-vous de NSFileManager
de replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
?
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.