2010-07-14 12 views
8

Estoy intentando copiar algunos archivos desde el paquete de mi aplicación al directorio de documentos en el primer inicio. Tengo los controles en su lugar para el primer lanzamiento, pero no están incluidos en el fragmento de código para mayor claridad. El problema es que estoy copiando en el directorio de documentos (que ya existe) y en la documentación, se establece que:iPhone (iOS): copiar archivos del paquete principal al error de la carpeta de documentos

dstPath no debe existir antes de la operación.

¿Cuál es la mejor manera para mí para lograr la copia directamente a la raíz de documentos? La razón por la que quiero hacer esto es permitir el soporte de iTunes para compartir archivos.

- (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; 
} 

Gracias

Respuesta

11

Su ruta de destino debe contener el nombre del elemento que se está copiando, no sólo la carpeta de documentos. Proveedores:

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

Editar: sentimos mal entendido su pregunta. No sé si hay una opción mejor que iterar a través del contenido de la carpeta y copiar cada elemento por separado. Si usted está apuntando iOS4 puede utilizar la función de NSArray -enumerateObjectsUsingBlock: para ello:

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]); 
    }]; 

P. S. Si no puede utilizar bloques puede utilizar la enumeración rápida:

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

Gracias por la respuesta, pero esto no es lo que quiero hacer. Lo que quiero hacer es copiar el contenido de la carpeta Populator a la raíz de los directorios (no una carpeta llamada Populator en la raíz de los documentos). Lo que dices que haga funciona, pero no es lo que quiero lograr. – Jack

+0

Muchas gracias, el malentendido fue casi seguramente mi culpa. Estoy usando este código para una aplicación de iPad, por lo que me enfocaré en iOS 3.2, aunque eventualmente esto admitirá iOS4. Gracias por su código, ¿alguna idea de cómo hacer que funcione para 3.2 (sin bloques)? – Jack

+1

Agregué el código usando la enumeración rápida. la solución de bloques era más para ejercitarme, los bloques son un concepto nuevo para mí. – Vladimir

6

una nota:
no emiten operación larga en didFinishLaunchingWithOptions: es un error conceptual. Si esta copia toma demasiado tiempo, el perro guardián te matará. ejecutarlo en un hilo secundario o NSOperation ... Yo personalmente uso un temporizador de proceso.

Cuestiones relacionadas