Copiar carpeta (w / contents) del package al directory de documentos – iOS

EDITAR: RESUELTO

Gracias Brooks. Su pregunta me llevó a seguir investigando si el file existía en mi package, ¡y no lo hizo!

Entonces usando este código (también a continuación): iPhone / iPad: No se puede copyr la carpeta de NSBundle a NSDocumentDirectory y las instrucciones para agregar un directory correctamente a Xcode (de aquí y de abajo) pude conseguir que funcione.

Copiar carpeta en Xcode:

  1. Crea un directory en tu Mac.
  2. Seleccione Agregar files existentes a su proyecto.
  3. Seleccione el Directorio que desea importar.
  4. En la window emergente, asegúrese de seleccionar "Copiar elementos en la carpeta del grupo de destino" y "Crear references de carpetas para cualquier carpeta agregada"
  5. Presiona "Agregar"
  6. El Directorio debe aparecer azul en lugar de amarillo.

    -(void) copyDirectory:(NSString *)directory { NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:directory]; NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:directory]; if (![fileManager fileExistsAtPath:documentDBFolderPath]) { //Create Directory! [fileManager createDirectoryAtPath:documentDBFolderPath withIntermediateDirectories:NO attributes:nil error:&error]; } else { NSLog(@"Directory exists! %@", documentDBFolderPath); } NSArray *fileList = [fileManager contentsOfDirectoryAtPath:resourceDBFolderPath error:&error]; for (NSString *s in fileList) { NSString *newFilePath = [documentDBFolderPath stringByAppendingPathComponent:s]; NSString *oldFilePath = [resourceDBFolderPath stringByAppendingPathComponent:s]; if (![fileManager fileExistsAtPath:newFilePath]) { //File does not exist, copy it [fileManager copyItemAtPath:oldFilePath toPath:newFilePath error:&error]; } else { NSLog(@"File exists: %@", newFilePath); } } 

    }

======================== FINAL EDITAR

Frus-stray-shee-on! De todas forms…

El código a continuación copy mi carpeta del package de la aplicación a la carpeta Documentos en el simulador muy bien. Sin embargo, en el dispositivo obtengo un error y ninguna carpeta. Usando ze Google, descubrí que el error (260) significa que el file (en este caso mi carpeta) no existe.

¿Qué podría estar yendo mal? ¿Por qué no puedo copyr mi carpeta del package a los documentos? He comprobado que los files existen, aunque la carpeta no se muestra, porque Xcode quiere un file plano. ¿Convirtió mi carpeta (arrastrada en Xcode) en un file plano de activos en su lugar?

Te agradezco por cualquier ayuda.

 // Could not copy report at path /var/mobile/Applications/3C3D7CF6-B1F0-4561-8AD7-A367C103F4D7/cmsdemo.app/plans.gallery to path /var/mobile/Applications/3C3D7CF6-B1F0-4561-8AD7-A367C103F4D7/Documents/plans.gallery. error Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)" UserInfo=0x365090 {NSFilePath=/var/mobile/Applications/3C3D7CF6-B1F0-4561-8AD7-A367C103F4D7/cmsdemo.app/plans.gallery, NSUnderlyingError=0x365230 "The operation couldn’t be completed. No such file or directory"} NSString *resourceDBFolderPath; NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:@"plans.gallery"]; BOOL success = [fileManager fileExistsAtPath:documentDBFolderPath]; if (success){ NSLog(@"Success!"); return; } else { resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"plans.gallery"]; [fileManager createDirectoryAtPath: documentDBFolderPath attributes:nil]; //[fileManager createDirectoryAtURL:documentDBFolderPath withIntermediateDirectories:YES attributes:nil error:nil]; [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error]; } //check if destinationFolder exists if ([ fileManager fileExistsAtPath:documentDBFolderPath]) { //removing destination, so source may be copied if (![fileManager removeItemAtPath:documentDBFolderPath error:&error]) { NSLog(@"Could not remove old files. Error:%@",error); return; } } error = nil; //copying destination if ( !( [ fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error ]) ) { NSLog(@"Could not copy report at path %@ to path %@. error %@",resourceDBFolderPath, documentDBFolderPath, error); return ; } 

Me he tomado la libertad de editar parte del código que siento que necesita un poco de limpieza. Estás usando methods en desuso, methods demasiado complicados y simplemente cosas ridículas. Por supuesto, comprobaría que su ruta de acceso al file es válida, que no tiene idea de qué es un file .gallery y no bash proporcionar un ficticio, el único juicio que puedo hacer es que su ruta de acceso al file simplemente no es válida porque el recurso no No existe donde creas que lo hace. (En un momento, solicita copyr el file en el directory de documentos, ¡luego verifique si existe en su package!)

  -(void)testMethod { NSString *resourceDBFolderPath; NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:@"plans.gallery"]; BOOL success = [fileManager fileExistsAtPath:documentDBFolderPath]; if (success){ NSLog(@"Success!"); return; } else { //simplified method with more common and helpful method resourceDBFolderPath = [[NSBundle mainBundle] pathForResource:@"plans" ofType:@"gallery"]; //fixed a deprecated method [fileManager createDirectoryAtPath:documentDBFolderPath withIntermediateDirectories:NO attributes:nil error:nil]; [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error]; //check if destinationFolder exists if ([ fileManager fileExistsAtPath:documentDBFolderPath]) { //FIXED, another method that doesn't return a boolean. check for error instead if (error) { //NSLog first error from copyitemAtPath NSLog(@"Could not remove old files. Error:%@", [error localizedDescription]); //remove file path and NSLog error if it exists. [fileManager removeItemAtPath:documentDBFolderPath error:&error]; NSLog(@"Could not remove old files. Error:%@", [error localizedDescription]); return; } } } }