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?

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.


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:


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);

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)
        }
    }

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


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)
    }

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..
}

Genau das, wonach ich gesucht habe. Vielen Dank !!
— Rogerstone
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.