Отримання списку файлів у папці Ресурси - iOS


85

Скажімо, у моїй папці «Ресурси» моєї програми iPhone є папка «Документи».

Чи є спосіб отримати під час виконання масив або список типів усіх файлів, що входять до цієї папки?

Отже, в коді це буде виглядати так:

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

Чи можливо це?

Відповіді:


139

Ви можете отримати шлях до Resourcesкаталогу в такий спосіб,

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

Потім додайте Documentsдо шляху,

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

Тоді ви можете використовувати будь-який з API переліку каталогів NSFileManager.

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

Примітка : Під час додавання вихідної папки до набору обов’язково виберіть «Створити посилання на папки для будь-якої опції доданих папок під час копіювання»


2
цікаво. без додавання він працював і знайшов усе (включаючи папку Документи). але з цим
додатком

о, почекайте, "Документи" - це "Група", а не папка. хм як додати папку в папку ресурсів?
CodeGuy

Ви можете Drag & Dropдодати папку до проекту, і вміст буде скопійовано. Або додайте Copy Filesфазу збірки та вкажіть каталог для копіювання в ньому.
Deepak Danduprolu

гаразд, я затягнув. але він все ще вважає, що каталог порожній. хм
CodeGuy

4
Ви вибрали Create folder references for any added foldersопцію під час копіювання?
Deepak Danduprolu

27

Стрімкий

Оновлено для Swift 3

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

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

Подальше читання:


4
Помилка домену = NSCocoaErrorDomain Код = 260 "Папка" Ресурси "не існує." UserInfo = {NSFilePath = / var / container / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Folder), NSUnderlyingError = 0x1c4450140 {Error Domainr = NSP Domain Error = DomainR файл або каталог "}}
Аргус

18

Ви також можете спробувати цей код:

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

NSLog(@"directoryContents ====== %@",directoryContents);

ви виділяєте масив у directoryContents, який негайно перезаписується масивом, який повертається contentOfDir ...
Йоріс Веймар

Я мав на увазі лише масив, який містив би вміст каталогу. Масив є лише для прикладу. Я трохи його відредагував.
neowinston

15

Swift версія:

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

7

Список усіх файлів у каталозі

     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
     }

Рекурсивне перерахування файлів в каталозі

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

Докладніше про NSFileManager тут


3
Це не буде працювати, якщо в розширенні є ".". Іншими словами, це буде працювати: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Лянцзюнь

4

Swift 3 (і URL-адреси, що повертаються)

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

3

Свіфт 4:

Якщо у вас є спільне з підкаталогами "По відношенню до проекту" (сині папки), ви можете написати:

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

Використання :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}

Точно те, що я шукав. Дякую !!
rogerstone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.