Получение списка файлов в папке Resources - iOS

85

Скажем, у меня есть папка в папке «Ресурсы» моего приложения для iPhone под названием «Документы».

Есть ли способ получить массив или какой-либо тип списка всех файлов, включенных в эту папку во время выполнения?

Итак, в коде это будет выглядеть так:

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

Это возможно?

CodeGuy
источник

Ответы:

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
интересно. без добавления он работал и все нашел (включая папку «Документы»). но с этим добавлением массив "directoryOfContents" будет нулевым
CodeGuy
о, подождите, «Документы» - это «Группа», а не папка. хм. как мне добавить папку в мою папку ресурсов?
CodeGuy
Вы можете Drag & Dropдобавить папку в проект, и ее содержимое будет скопировано. Или добавьте Copy Filesэтап сборки и укажите каталог для копирования в него.
Deepak Danduprolu
хорошо, я притащил его. но он все еще думает, что каталог пуст. хм.
CodeGuy
4
Вы выбрали Create folder references for any added foldersвариант при копировании?
Deepak Danduprolu
27

Swift

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

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

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

Дальнейшее чтение:

Suragch
источник
4
Ошибка домена = NSCocoaErrorDomain Code = 260 «Папка« Ресурсы »не существует». UserInfo = {NSFilePath = / var / container / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Папка), NSUnderlyingError = 0x1c4450140 {Error Domain = NSPomainDOSIX such файл или каталог "}}
Аргус
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);
Neowinston
источник
вы выделяете массив в directoryContents, который немедленно перезаписывается массивом, возвращаемым по contentsOfDir ...
Джорис Веймар,
То, что я хотел показать, было просто массивом, который будет содержать содержимое каталога. Массив есть только для примера. Я его немного отредактировал.
neowinston
15

Быстрая версия:

    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'"];
Лянцзюнь 08
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

Swift 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..
}
Алессандро Орнано
источник
Именно то, что я искал. Благодарность !!
Роджерстон