Obteniendo una lista de archivos en la carpeta Recursos – iOS

Digamos que tengo una carpeta en mi carpeta “Recursos” de mi aplicación de iPhone llamada “Documentos”.

¿Hay alguna manera de que pueda obtener una matriz o algún tipo de lista de todos los archivos incluidos en esa carpeta en tiempo de ejecución?

Entonces, en el código, se vería así:

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

es posible?

Puede obtener la ruta al directorio de Resources esta manera,

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

A continuación, agregue los Documents a la ruta,

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

Luego puede usar cualquiera de las API de listado de directorio de NSFileManager .

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

Nota : Al agregar una carpeta de origen al paquete, asegúrese de seleccionar la opción “Crear referencias de carpeta para cualquier carpeta agregada al copiar”

Rápido

Actualizado para Swift 3

 let docsPath = Bundle.main.resourcePath! + "/Resources" let fileManager = FileManager.default do { let docsArray = try fileManager.contentsOfDirectory(atPath: docsPath) } catch { print(error) } 

Otras lecturas:

  • Referencia de clase NSFileManager
  • Guía de progtwigción del sistema de archivos
  • Error al manejar documentos
  • Manejo de errores en la publicación de blog Swift 2.0
  • Cómo encontrar el tipo de errores que un método puede arrojar y atraparlos en Swift

Puedes probar este código también:

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

Versión Swift:

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

Listado de todos los archivos en un directorio

  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 } 

Recursivamente enumerando archivos en un directorio

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

Para obtener más información sobre NSFileManager aquí

Swift 3 (y URL que regresan)

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

Swift 4:

Si tiene que ver con subdirectorios “Relativo al proyecto” (carpetas azules) puede escribir:

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

Uso :

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