2009-09-30 14 views
9

Sono nuovo alla programmazione per iPhone. Voglio leggere il contenuto di un file di testo che si trova in una sottocartella della cartella Risorse.iPhone: Ottieni il percorso del file che si trova nella sottocartella della cartella Risorse

La struttura delle cartelle delle risorse è la seguente:

Resource

  1. Folder1 ----> Data.txt
  2. Cartella2 ----> Data.txt
  3. Folder3-- -> Folder1 ----> Data.txt

Ci sono più file denominati "Data.txt", quindi come posso accedere ai file in ogni cartella? So come leggere il file di testo, ma se la struttura delle risorse è simile alla struttura precedente, come posso ottenere il percorso?

Ad esempio, se desidero accedere al file "Data.txt" da Folder3, come posso ottenere il percorso del file?

Si prega di suggerire.

risposta

12

Per continuare psychotiks rispondere un esempio completo sarebbe simile a questa:

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 

} 

Si noti che è possibile utilizzare -pathForResource: OfType: inDirectory per accedere le risorse in sottodirectory.

+0

Ma ci sono più cartelle con lo stesso nome in una cartella diversa. quindi in questo caso come può ottenere il percorso – Rupesh

+4

@Rupesh: Per la seconda cartella dovresti usare: '[thisBundle pathForResource: @" Data "ofType: @" txt "inDirectory: @" Folder3/Folder1 "]'. Si noti che l'argomento 'inDirectory:' è relativo alla radice del pacchetto. – PeyloW

+1

Si dovrebbe davvero usare '[NSString stringWithContentsOfFile: codec filePath: NSUTF8StringEncoding errore: NULL]', in questo modo la memoria è _ "gestita" _, e ancora più importante 'initWithContentsOfFile:' è deprecato da Mac OS X 10.4, e ** non disponibile su iPhone OS **. Quindi il codice funzionerà solo nel simulatore. – PeyloW

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

Questo ti dà il percorso per il tuo gruppo. Da lì in poi, puoi navigare nella struttura delle cartelle.

16

La "cartella risorse" "" è in realtà il contenuto del pacchetto principale, noto anche come pacchetto di applicazioni. Si utilizza pathForResource:ofType: o pathForResource:ofType:inDirectory: per ottenere il percorso completo per una risorsa.

Caricamento il contenuto di un file come una stringa è fatto con il metodo stringWithContentsOfFile:encoding:error: per una stringa di autoreleased con initWithContentsOfFile:encoding:error: se si desidera una stringa mantenuto.

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 
} 

Questa è quasi la stessa risposta data da Shirkrin in precedenza, ma con la leggera differenza che funziona sul bersaglio. Questo perché initWithContentsOfFile: è deprecato su Mac OS X e non è disponibile su tutti i sistemi operativi iPhone.

7

Shirkrin's answer e PeyloW's answer sopra erano entrambi utili, e sono riuscito a utilizzare pathForResource:ofType:inDirectory: per accedere ai file con lo stesso nome in diverse cartelle nel mio pacchetto di app.

Ho trovato anche una soluzione alternativa here adatta alle mie esigenze leggermente migliore, quindi ho pensato di condividerla. In particolare, vedere this link.

Per esempio, dire che ho i seguenti riferimenti delle cartelle (icone blu, i gruppi sono di colore giallo):

enter image description here

Allora posso accedere ai file di immagine in questo modo:

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

As una nota a margine, l'equivalente pathForResource:ofType:inDirectory: è simile al seguente:

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

grazie. funziona bene –

Problemi correlati