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?

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"


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:


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

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

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í


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

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

Exactamente lo que estaba buscando. Gracias !!
rogerstone
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.