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?

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”


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:


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

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

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


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

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

Dokładnie to, czego szukałem. Dzięki !!
rogerstone
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.