Pobieranie listy plików w folderze Resources - iOS

85

Załóżmy, że w folderze „Zasoby” aplikacji na telefon iPhone mam folder o nazwie „Dokumenty”.

Czy istnieje sposób, w jaki mogę uzyskać tablicę lub jakąś listę wszystkich plików zawartych w tym folderze w czasie wykonywania?

Tak więc w kodzie wyglądałoby to tak:

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

czy to możliwe?

CodeGuy
źródło

Odpowiedzi:

139

Możesz uzyskać ścieżkę do Resourceskatalogu w ten sposób,

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

Następnie dołącz Documentsdo ścieżki,

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

Następnie możesz użyć dowolnego interfejsu API z listą katalogów NSFileManager.

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

Uwaga : podczas dodawania folderu źródłowego do pakietu upewnij się, że wybrałeś opcję „Utwórz odniesienia do folderów dla wszystkich dodanych folderów podczas kopiowania”

Deepak Danduprolu
źródło
2
ciekawy. bez dołączania zadziałało i znalazło wszystko (w tym folder Dokumenty). ale z tym dodatkiem tablica „directoryOfContents” ma wartość null
CodeGuy
och, czekaj, „Dokumenty” to „Grupa”, a nie folder. hm. jak dodać folder do folderu zasobów?
CodeGuy
Możesz Drag & Droputworzyć folder w projekcie, a zawartość zostanie skopiowana. Lub Dodaj Copy Filesfazę kompilacji i określ katalog do skopiowania.
Deepak Danduprolu
okej, przeciągnąłem go. ale nadal uważa, że ​​katalog jest pusty. hm.
CodeGuy
4
Czy wybrałeś Create folder references for any added foldersopcję podczas kopiowania?
Deepak Danduprolu
27

Szybki

Zaktualizowano dla Swift 3

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

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

Czytaj dalej:

Suragch
źródło
4
Error Domain = NSCocoaErrorDomain Code = 260 „Folder„ Resources ”nie istnieje." UserInfo = {NSFilePath = / var / Containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Folder), NSUnderlyingError = 0x1c4450140 {Error Domain = NSPOSE taki kod plik lub katalog "}}
Argus
18

Możesz również wypróbować ten kod:

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
źródło
alokujesz tablicę w directoryContents, która jest natychmiast nadpisywana przez tablicę zwracaną przez contentOfDir ...
Joris Weimar
Chciałem pokazać tylko tablicę, która będzie przechowywać zawartość katalogu. Tablica jest tam na przykład dla dobra. Zmodyfikowałem to nieznacznie.
neowinston
15

Wersja Swift:

    if let files = try? FileManager.default.contentsOfDirectory(atPath: Bundle.main.bundlePath ){
        for file in files {
            print(file)
        }
    }
Matt Frear
źródło
7

Lista wszystkich plików w katalogu

     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
     }

Rekurencyjne wyliczanie plików w katalogu

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

Więcej informacji o NSFileManager znajdziesz tutaj

Govind
źródło
3
Nie zadziała, jeśli rozszerzenie ma „.”. Innymi słowy, to zadziała: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun,
4

Swift 3 (i powracające adresy URL)

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

Swift 4:

Jeśli masz do czynienia z podkatalogami „Względem projektu” (niebieskie foldery), możesz napisać:

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

Zastosowanie :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}
Alessandro Ornano
źródło
Dokładnie to, czego szukałem. Dzięki !!
rogerstone