2010-07-14 7 views
8

J'essaie de copier certains fichiers de mon ensemble d'applications vers le répertoire de documents lors du premier lancement. J'ai les contrôles en place pour le premier lancement, mais ils ne sont pas inclus dans l'extrait de code pour plus de clarté. Le problème est que je copie dans le répertoire des documents (qui existe déjà) et dans la documentation, il est dit que:iPhone (iOS): copie de fichiers de l'ensemble principal vers l'erreur de dossier de documents

dstPath ne doit pas exister avant l'opération.

Quelle est la meilleure façon pour moi d'obtenir la copie directement à la racine des documents? La raison pour laquelle je veux faire ceci est de permettre le support de partage de fichiers iTunes.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Populator"]; 

    NSLog(@"\nSource Path: %@\nDocuments Path: %@", sourcePath, documentsDirectory); 

    NSError *error = nil; 

    if([[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:documentsDirectory error:&error]){ 
    NSLog(@"Default file successfully copied over."); 
    } else { 
    NSLog(@"Error description-%@ \n", [error localizedDescription]); 
    NSLog(@"Error reason-%@", [error localizedFailureReason]); 
    } 
    ... 
    return YES; 
} 

Merci

Répondre

11

Votre chemin de destination doit contenir le nom de l'élément copié, non seulement le dossier des documents. Essayez:

if([[NSFileManager defaultManager] copyItemAtPath:sourcePath 
      toPath:[documentsDirectory stringByAppendingPathComponent:@"Populator"] 
      error:&error]){ 
... 

Edit: Désolé mal compris votre question. Je ne sais pas s'il existe une meilleure option que de parcourir le contenu du dossier et de copier chaque élément séparément. Si vous ciblez iOS4, vous pouvez utiliser la fonction -enumerateObjectsUsingBlock: de NSArray pour que:

NSArray* resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:copyItemAtPath:sourcePath error:NULL]; 
[resContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    { 
     NSError* error; 
     if (![[NSFileManager defaultManager] 
        copyItemAtPath:[sourcePath stringByAppendingPathComponent:obj] 
        toPath:[documentsDirectory stringByAppendingPathComponent:obj] 
        error:&error]) 
      DLogFunction(@"%@", [error localizedDescription]); 
    }]; 

post-scriptum Si vous ne pouvez pas utiliser des blocs, vous pouvez utiliser l'énumération rapide:

NSArray* resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:copyItemAtPath:sourcePath error:NULL]; 

for (NSString* obj in resContents){ 
    NSError* error; 
    if (![[NSFileManager defaultManager] 
       copyItemAtPath:[sourcePath stringByAppendingPathComponent:obj] 
       toPath:[documentsDirectory stringByAppendingPathComponent:obj] 
       error:&error]) 
      DLogFunction(@"%@", [error localizedDescription]); 
    } 
+0

Merci pour la réponse, mais ce n'est pas ce que je veux faire. Ce que je veux faire est de copier le contenu du dossier Populator vers la racine des répertoires (pas un dossier appelé Populator dans la racine des documents). Ce que vous dites de faire fonctionne, mais ce n'est pas ce que je veux accomplir. – Jack

+0

Merci beaucoup, le malentendu était presque certainement ma faute. J'utilise ce code pour une application iPad, je vais donc cibler iOS 3.2, même si cela finira par supporter iOS4. Merci pour votre code, aucune idée de comment le faire fonctionner pour 3.2 (sans blocs)? – Jack

+1

J'ai ajouté du code en utilisant l'énumération rapide. la solution de blocs était plus pour m'exercer - les blocs sont un nouveau concept pour moi. – Vladimir

6

une note:
n'émettez opération longue dans didFinishLaunchingWithOptions: est une erreur conceptuelle. Si cette copie prend trop de temps, le chien de garde vous tue. lancez-le dans un thread secondaire ou NSOperation ... Personnellement, j'utilise un proc de minuterie.

Questions connexes