Obtener una lista de archivos en la carpeta Recursos - iOS

85

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 código, se vería así:

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

es posible?

CodeGuy
fuente

Respuestas:

139

Puede obtener la ruta al Resourcesdirectorio de esta manera,

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

Luego agregue el Documentsal camino,

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

Luego, puede usar cualquiera de las API de lista de directorios de NSFileManager.

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

Nota : Cuando agregue la carpeta de origen al paquete, asegúrese de seleccionar "Crear referencias de carpeta para cualquier opción de carpetas agregadas al copiar"

Deepak Danduprolu
fuente
2
interesante. sin el agregado funcionó y encontró todo (incluida la carpeta Documentos). pero con ese agregado, la matriz "directoryOfContents" es nula
CodeGuy
Oh, espera, "Documentos" es un "Grupo", no una carpeta. hm. ¿Cómo agrego una carpeta en mi carpeta de recursos?
CodeGuy
Puede Drag & Dropcolocar una carpeta en el proyecto y el contenido se copiará. O agregue una Copy Filesfase de compilación y especifique el directorio para copiar en ella.
Deepak Danduprolu
bien, lo arrastré. pero todavía cree que el directorio está vacío. hm.
CodeGuy
4
¿Seleccionó la Create folder references for any added foldersopción al copiar?
Deepak Danduprolu
27

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:

Suragch
fuente
4
Error Domain = NSCocoaErrorDomain Code = 260 "La carpeta" Recursos "no existe." UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Carpeta), NSUnderlyingError = 0x1c4450140 {2 Código de error de dominio = NSDPOSIX archivo o directorio "}}
Argus
18

También puedes probar este código:

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
fuente
está asignando una matriz en directoryContents que se sobrescribe inmediatamente por una matriz devuelta por contentsOfDir ...
Joris Weimar
Lo que quise mostrar fue solo una matriz que contendría el contenido del directorio. La matriz está ahí solo por ejemplo. Lo he editado un poco.
neowinston
15

Versión rápida:

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

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
     }

Enumerar archivos de forma recursiva 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 más información sobre NSFileManager está aquí

Govind
fuente
3
No funcionará si la extensión tiene el '.'. En otras palabras, esto funcionará: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun
4

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)
    }
narco
fuente
3

Rápido 4:

Si tiene que ver con subdirectorios "Relativo al proyecto" (carpetas azules) podría 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..
}
Alessandro Ornano
fuente
Exactamente lo que estaba buscando. Gracias !!
rogerstone