2009-09-30 11 views
9

Soy nuevo en la programación de iPhone. Quiero leer el contenido de un archivo de texto ubicado en una subcarpeta de la carpeta de Recursos.iPhone: obtenga la ruta del archivo que se encuentra dentro de la subcarpeta de la carpeta de recursos

La estructura de carpetas de recursos es la siguiente:

Recursos

  1. Carpeta1 ----> Data.txt
  2. Carpeta2 ----> Data.txt
  3. Folder3-- -> Carpeta1 ----> Datos.txt

Existen varios archivos llamados "Data.txt", entonces, ¿cómo puedo acceder a los archivos de cada carpeta? Sé cómo leer el archivo de texto, pero si la estructura del recurso es similar a la estructura anterior, entonces, ¿cómo puedo obtener la ruta?

Por ejemplo, si deseo acceder al archivo "Data.txt" de la Carpeta 3, ¿cómo puedo obtener la ruta del archivo?

Sugerido.

Respuesta

12

Para continuar psychotiks responder a un ejemplo completo se vería así:

NSBundle *thisBundle = [NSBundle bundleForClass:[self class]]; 
NSString *filePath = nil; 

if (filePath = [thisBundle pathForResource:@"Data" ofType:@"txt" inDirectory:@"Folder1"]) { 

    theContents = [[NSString alloc] initWithContentsOfFile:filePath]; 

    // when completed, it is the developer's responsibility to release theContents 

} 

Tenga en cuenta que puede utilizar -pathForResource: OfType: elDirectorio acceder a Recursos en los subdirectorios.

+0

Pero hay varias carpetas con el mismo nombre en diferentes carpetas. entonces en este caso, ¿cómo se puede lograr la ruta – Rupesh

+4

@Rupesh: para la segunda carpeta necesitaría usar: '[thisBundle pathForResource: @" Data "ofType: @" txt "inDirectory: @" Folder3/Folder1 "]'. Observe que el argumento 'inDirectory:' es relativo a la raíz del paquete. – PeyloW

+1

Realmente debería usar '[NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: NULL]', de esta manera la memoria es _ "managed" _, y más importante aún 'initWithContentsOfFile:' está en desuso desde Mac OS X 10.4 y ** no disponible en iPhone OS **. Entonces el código solo funcionará en el simulador. – PeyloW

4
NSBundle* bundle = [NSBundle mainBundle]; 
    NSString* path = [bundle bundlePath]; 

Esto le indica el camino a su paquete. A partir de ahí, puede navegar su estructura de carpetas.

16

Su "carpeta de recursos" es en realidad el contenido de su paquete principal, también conocido como el paquete de la aplicación. Utiliza pathForResource:ofType: o pathForResource:ofType:inDirectory: para obtener la ruta completa de un recurso.

Cargando el contenido de un archivo como una cadena se realiza con el stringWithContentsOfFile:encoding:error: método para una cadena de autoreleased con initWithContentsOfFile:encoding:error: si desea una cadena retenida.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Data" 
                ofType:@"txt" 
               inDirectory:@"Folder1"]; 
if (filePath != nil) { 
    theContents = [NSString stringWithContentsOfFile:filePath 
              encoding:NSUTF8StringEncoding 
              error:NULL]; 
    // Do stuff to theContents 
} 

Esta es casi la misma respuesta que la dada por Shirkrin anteriormente, pero con la leve diferencia de que funciona en el objetivo. Esto se debe a que initWithContentsOfFile: está en desuso en Mac OS X y no está disponible en todos los sistemas operativos de iPhone.

7

Shirkrin's answer y PeyloW's answer anteriores fueron útiles, y me las arreglé para usar pathForResource:ofType:inDirectory: para acceder a archivos con el mismo nombre en diferentes carpetas en mi paquete de aplicaciones.

También encontré una solución alternativa here que se ajustaba mejor a mis requisitos, así que pensé en compartirla. En particular, ver this link.

Por ejemplo, decir que tengo las siguientes referencias a carpetas (iconos azules, los grupos son de color amarillo):

enter image description here

Entonces puedo acceder a los archivos de imagen de la siguiente manera:

NSString * filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"pin_images/1/2.jpg"]; 
UIImage * image = [UIImage imageWithContentsOfFile:filePath]; 

Como una nota al margen, el equivalente pathForResource:ofType:inDirectory: tiene este aspecto:

NSString * filePath = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg" inDirectory:@"pin_images/1/"]; 
+0

gracias. funciona bien –

Cuestiones relacionadas