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.