0

Dans la version actuelle de mon application, j'ai stocké deux fichiers d'application importants (mon fichier .sqlite Core Data et mon fichier SettingsFile.plist) dans NSDocumentDirectory. Dans la prochaine version, je veux déplacer ces fichiers vers NSLibraryDirectory. Aucun des deux ne doit être directement accessible par l'utilisateur pour l'édition, et il semble de ma recherche que c'est la meilleure option pour chacun de ces fichiers.Comment déplacer les fichiers de données d'application iOS pour la nouvelle version de l'application de NSDocumentDirectory vers NSLibraryDirectory?

Je suis préoccupé par la façon de déplacer les fichiers de tous mes utilisateurs d'applications actuels de NSDocumentDirectory à NSLibraryDirectory. Je veux faire très attention à ne pas perdre les données des utilisateurs. Je ne sais pas où et comment commencer à déplacer ces fichiers de façon très sécuritaire. J'espère que quelqu'un peut me diriger dans la bonne direction.

+0

Tu ne peux pas simplement tester si le fichier est dans le répertoire de la bibliothèque et le cas échéant, l'utiliser à partir de là, et si elle est dans le répertoire des documents le déplacer à travers et ensuite commencer à l'utiliser? Je ne comprends pas la complication. – Droppy

Répondre

2

Vous pouvez utiliser NSFileManager pour vérifier si les fichiers existent déjà dans le dossier Bibliothèque, sinon, déplacez-les. Si le déplacement a réussi, supprimez l'ancien fichier et renvoyez le nouveau chemin, sinon, renvoyez l'ancien chemin. Voir ci-dessous:

... 
NSString *mySQLfilePath = [self getFilePathWithName:@"database.sqlite"]; 
... 

- (NSString *)getFilePathWithName:(NSString *)filename 
{ 
    NSString *libPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library"]; 
    NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 

    NSString *fileLibPath = [libPath stringByAppendingPathComponent:filename]; 
    NSString *fileDocPath = [docPath stringByAppendingPathComponent:filename]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:fileLibPath]) { 
     // file already exists in Library folder 
     return fileLibPath; 

    } else if ([[NSFileManager defaultManager] fileExistsAtPath:fileDocPath]) { 
     // file exists in Documents folder, so move it to Library 
     NSError *error = nil; 
     BOOL moved = [[NSFileManager defaultManager] moveItemAtPath:fileDocPath toPath:fileLibPath error:&error]; 
     NSLog(@"move error: %@", error); 

     // if file moved, you can delete old Doc file if you want 
     if (moved) [self deleteFileAtPath:fileDocPath]; 

     // if file moved successfully, return the Library file path, else, return the Documents file path 
     return moved ? fileLibPath : fileDocPath; 
    } 

    // file doesn't exist 
    return nil; 
} 

- (void)deleteFileAtPath:(NSString *)filePath 
{ 
    if ([[NSFileManager defaultManager] isDeletableFileAtPath:filePath]) { 
     NSError *error = nil; 
     [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 
     NSLog(@"delete error: %@", error); 

    } else { 
     NSLog(@"can not delete file: %@", filePath); 
    } 
} 

Si vous avez des questions, n'hésitez pas. Et pour les visiteurs de référence:

https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

+0

'[NSHomeDirectory() stringByAppendingPathComponent: @" Bibliothèque "];'? Je ne pense pas ... – Droppy

+0

NSHomeDirectory(): '/ Application/DAF1FB3A-3ED3-464C-AAEB-CC21F3761355' NSLibraryDirectory:'/Application/DAF1FB3A-3ED3-464C-AAEB-CC21F3761355/Library' NSDocumentsDirectory: '/ Application/DAF1FB3A-3ED3-464C-AAEB-CC21F3761355/Documents' – emotality

+0

Vous êtes censé utiliser' NSSearchPathForDiriesiesInDomains'. – Droppy