Ottenere un elenco di file nella cartella Risorse - iOS


85

Diciamo che ho una cartella nella mia cartella "Risorse" della mia applicazione per iPhone chiamata "Documenti".

C'è un modo per ottenere un array o un tipo di elenco di tutti i file inclusi in quella cartella in fase di esecuzione?

Quindi, nel codice, sarebbe simile a:

NSMutableArray *myFiles = [...get a list of files in Resources/Documents...];

È possibile?

Risposte:


139

Puoi ottenere il percorso della Resourcesdirectory in questo modo,

NSString * resourcePath = [[NSBundle mainBundle] resourcePath];

Quindi aggiungi il Documentsal percorso,

NSString * documentsPath = [resourcePath stringByAppendingPathComponent:@"Documents"];

Quindi puoi utilizzare una qualsiasi delle API di elenchi di directory di NSFileManager.

NSError * error;
NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsPath error:&error];

Nota : quando aggiungi la cartella di origine al pacchetto, assicurati di selezionare "Crea riferimenti cartella per qualsiasi opzione di cartella aggiunta durante la copia"


2
interessante. senza l'aggiunta ha funzionato e ha trovato tutto (inclusa la cartella Documenti). ma con quell'appendice, l'array "directoryOfContents" è nullo
CodeGuy

oh aspetta, "Documenti" è un "Gruppo" non una cartella. hm. come aggiungo una cartella nella mia cartella delle risorse?
CodeGuy

È possibile inserire Drag & Dropuna cartella nel progetto e il contenuto verrà copiato. Oppure Aggiungi una Copy Filesfase di compilazione e specifica la directory da copiare al suo interno.
Deepak Danduprolu

ok, l'ho trascinato dentro. ma continua a pensare che la directory sia vuota. hm.
CodeGuy

4
Hai selezionato l' Create folder references for any added foldersopzione durante la copia?
Deepak Danduprolu

28

Swift

Aggiornato per Swift 3

let docsPath = Bundle.main.resourcePath! + "/Resources"
let fileManager = FileManager.default

do {
    let docsArray = try fileManager.contentsOfDirectory(atPath: docsPath)
} catch {
    print(error)
}

Ulteriore lettura:


4
Error Domain = NSCocoaErrorDomain Code = 260 "La cartella" Resources "non esiste." UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Folder), NSUnderlyingError = 0x1c4450140 {Error Domain 2 NSPOMain Code file o directory "}}
Argus

18

Puoi provare questo codice anche:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError * error;
NSArray * directoryContents =  [[NSFileManager defaultManager]
                      contentsOfDirectoryAtPath:documentsDirectory error:&error];

NSLog(@"directoryContents ====== %@",directoryContents);

stai allocando un array in directoryContents che viene immediatamente sovrascritto da un array restituito da contentsOfDir ...
Joris Weimar

Quello che intendevo mostrare era solo un array che avrebbe contenuto il contenuto della directory. L'array è lì solo per amor di esempio. L'ho modificato leggermente.
neowinston

15

Versione Swift:

    if let files = try? FileManager.default.contentsOfDirectory(atPath: Bundle.main.bundlePath ){
        for file in files {
            print(file)
        }
    }

7

Elenco di tutti i file in una directory

     NSFileManager *fileManager = [NSFileManager defaultManager];
     NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
     NSArray *contents = [fileManager contentsOfDirectoryAtURL:bundleURL
                           includingPropertiesForKeys:@[]
                                              options:NSDirectoryEnumerationSkipsHiddenFiles
                                                error:nil];

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension ENDSWITH '.png'"];
     for (NSString *path in [contents filteredArrayUsingPredicate:predicate]) {
        // Enumerate each .png file in directory
     }

Enumerazione ricorsiva dei file in una directory

      NSFileManager *fileManager = [NSFileManager defaultManager];
      NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
      NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:bundleURL
                                   includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
                                                     options:NSDirectoryEnumerationSkipsHiddenFiles
                                                errorHandler:^BOOL(NSURL *url, NSError *error)
      {
         NSLog(@"[Error] %@ (%@)", error, url);
      }];

      NSMutableArray *mutableFileURLs = [NSMutableArray array];
      for (NSURL *fileURL in enumerator) {
      NSString *filename;
      [fileURL getResourceValue:&filename forKey:NSURLNameKey error:nil];

      NSNumber *isDirectory;
      [fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];

       // Skip directories with '_' prefix, for example
      if ([filename hasPrefix:@"_"] && [isDirectory boolValue]) {
         [enumerator skipDescendants];
         continue;
       }

      if (![isDirectory boolValue]) {
          [mutableFileURLs addObject:fileURL];
       }
     }

Per ulteriori informazioni su NSFileManager è qui


3
Non funzionerà se l'estensione ha ".". In altre parole, funzionerà: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun

4

Swift 3 (e URL di ritorno)

let url = Bundle.main.resourceURL!
    do {
        let urls = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys:[], options: FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)
    } catch {
        print(error)
    }

3

Swift 4:

Se hai a che fare con le sottodirectory "Relative to project" (cartelle blu) potresti scrivere:

func getAllPListFrom(_ subdir:String)->[URL]? {
    guard let fURL = Bundle.main.urls(forResourcesWithExtension: "plist", subdirectory: subdir) else { return nil }
    return fURL
}

Utilizzo :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}

Esattamente quello che stavo cercando. Grazie !!
rogerstone
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.