Abrufen einer Liste der Dateien im Ordner Ressourcen - iOS

85

Angenommen, ich habe einen Ordner in meinem Ordner "Ressourcen" meiner iPhone-Anwendung mit dem Namen "Dokumente".

Gibt es eine Möglichkeit, zur Laufzeit ein Array oder eine Liste aller in diesem Ordner enthaltenen Dateien abzurufen?

Im Code würde es also so aussehen:

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

Ist das möglich?

CodeGuy
quelle

Antworten:

138

Sie können den Pfad zum ResourcesVerzeichnis wie folgt abrufen:

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

Dann hängen Sie das Documentsan den Pfad,

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

Dann können Sie eine der Verzeichnislisten-APIs von verwenden NSFileManager.

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

Hinweis : Wenn Sie dem Bundle einen Quellordner hinzufügen, stellen Sie sicher, dass Sie beim Kopieren die Option "Ordnerreferenzen für alle hinzugefügten Ordner erstellen" auswählen.

Deepak Danduprolu
quelle
2
interessant. ohne das Anhängen funktionierte es und fand alles (einschließlich des Ordners Dokumente). aber mit diesem Anhang ist das Array "directoryOfContents" null
CodeGuy
Oh, warte, "Dokumente" ist eine "Gruppe", kein Ordner. Hm. Wie füge ich einen Ordner zu meinem Ressourcenordner hinzu?
CodeGuy
Sie können Drag & Dropeinen Ordner in das Projekt einfügen und der Inhalt wird kopiert. Oder Fügen Sie eine Copy FilesErstellungsphase hinzu und geben Sie das Verzeichnis an, in das kopiert werden soll.
Deepak Danduprolu
Okay, ich habe es hineingezogen. Aber es denkt immer noch, dass das Verzeichnis leer ist. Hm.
CodeGuy
4
Haben Sie Create folder references for any added foldersbeim Kopieren die Option ausgewählt ?
Deepak Danduprolu
27

Schnell

Aktualisiert für Swift 3

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

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

Weiterführende Literatur:

Suragch
quelle
4
Error Domain = NSCocoaErrorDomain Code = 260 "Der Ordner" Resources "existiert nicht." UserInfo = {NSFilePath = / var / container / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Ordner), NSUnderlyingError = 0x1c4450140 {Error Domain = 2 Datei oder Verzeichnis "}}
Argus
18

Sie können diesen Code auch ausprobieren:

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

NSLog(@"directoryContents ====== %@",directoryContents);
Neowinston
quelle
Sie ordnen ein Array in directoryContents zu, das sofort von einem Array überschrieben wird, das von contentOfDir zurückgegeben wird ...
Joris Weimar
Was ich zeigen wollte, war nur ein Array, das den Inhalt des Verzeichnisses enthalten würde. Das Array ist nur zum Beispiel da. Ich habe es leicht bearbeitet.
Neowinston
12

Schnelle Version:

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

Auflisten aller Dateien in einem Verzeichnis

     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
     }

Rekursives Auflisten von Dateien in einem Verzeichnis

      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];
       }
     }

Weitere Informationen zu NSFileManager finden Sie hier

Govind
quelle
3
Es wird nicht funktionieren, wenn die Erweiterung das '.' Hat. Mit anderen Worten, dies funktioniert: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun
4

Swift 3 (und zurückgegebene URLs)

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

Swift 4:

Wenn Sie mit den Unterverzeichnissen "Relativ zum Projekt" (blaue Ordner) zu tun haben, können Sie schreiben:

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

Verwendung :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}
Alessandro Ornano
quelle
Genau das, wonach ich gesucht habe. Vielen Dank !!
Rogerstone