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.