2011-04-29 12 views
14

Tengo una carpeta "descomprimida" en mi paquete de aplicaciones. Necesito obtener las rutas de recursos para todos los archivos de tipo txt. He estado usando esto,¿Cómo obtengo todas las rutas de recursos en mi paquete recursivamente en iOS?

NSArray *filePaths = [NSBundle pathsForResourcesOfType:@"txt" inDirectory:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/unzipped"]]; 

Pero solo obtiene los archivos en el primer directorio. ¿Hay alguna versión recursiva de esto en algún lugar que me estoy perdiendo?

+0

Su título dice para obtener todos los caminos de recursos, pero el cuerpo dice que sólo recibe txt así que sí un poco las dos caras. : -/Vine aquí buscando una forma de obtener todos los archivos. – Jonny

+0

Debería poder hacer lo mismo con NSDirectoryEnumerator a continuación, simplemente elimine el condicional que verifica el tipo de archivo. – smokingoyster

Respuesta

19

me consiguió este trabajo utilizando el código Publicado por @rekle como punto de partida El truco es usar NSDirectoryEnumerator, que lo hará de forma recursiva. Aquí está la función que escribí en caso de que alguien lo necesite.

- (NSArray *)recursivePathsForResourcesOfType:(NSString *)type inDirectory:(NSString *)directoryPath{ 

    NSMutableArray *filePaths = [[NSMutableArray alloc] init]; 

    // Enumerators are recursive 
    NSDirectoryEnumerator *enumerator = [[[NSFileManager defaultManager] enumeratorAtPath:directoryPath] retain]; 

    NSString *filePath; 

    while ((filePath = [enumerator nextObject]) != nil){ 

     // If we have the right type of file, add it to the list 
     // Make sure to prepend the directory path 
     if([[filePath pathExtension] isEqualToString:type]){ 
      [filePaths addObject:[directoryPath stringByAppendingPathComponent:filePath]]; 
     } 
    } 

    [enumerator release]; 

    return [filePaths autorelease]; 
} 

Swift, utilizando NSURL

func recursivePathsForResources(type type: String) -> [NSURL] { 

    // Enumerators are recursive 
    let enumerator = NSFileManager.defaultManager().enumeratorAtPath(bundlePath) 
    var filePaths = [NSURL]() 

    while let filePath = enumerator?.nextObject() as? String { 

     if NSURL(fileURLWithPath: filePath).pathExtension == type { 
      filePaths.append(bundleURL.URLByAppendingPathComponent(filePath)) 
     } 
    } 

    return filePaths 
} 
+0

por favor use 'stringByAppendingPathComponent:' – Mazyod

4

intentar algo como esto:

 
NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; 
NSError *error = nil; 
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundlePath error:&error]; 

'ficheros' será una matriz de cadenas que contienen todos los nombres de archivo en ese camino ...

+0

Eso obtiene todos los archivos, no solo los archivos de texto, lo cual es de esperar. pero no se repite a través de los directorios. – smokingoyster

+0

No visita recursivamente todos los directorios dentro de la ruta proporcionada. – Zorayr

0

Antes de copiar Piense en crear enlace simbólico. Puede crear solo un enlace simbólico a la carpeta con muchos elementos. Y funcionará en la mayoría de las situaciones.

Va a ser libre de crear otro hilo, a la espera de final de la operación, etc.

7

Sólo una actualización de este método para permitir cualquier tipo de archivo (nulas) y proporcionar el formato de ruta correcta

- (NSArray *)recursivePathsForResourcesOfType:(NSString *)type inDirectory:(NSString *)directoryPath{ 

    NSMutableArray *filePaths = [[NSMutableArray alloc] init]; 
    NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:directoryPath]; 

    NSString *filePath; 

    while ((filePath = [enumerator nextObject]) != nil){ 
     if (!type || [[filePath pathExtension] isEqualToString:type]){ 
      [filePaths addObject:[directoryPath stringByAppendingPathComponent:filePath]]; 
     } 
    } 

    return filePaths; 
} 
1

Swift versión 3.1 del answer from smokinggoyster

func recursivePathsForResources(type: String, in directoryPath: String) -> [String] { 
    // Enumerators are recursive 
    let enumerator = FileManager.default.enumerator(atPath: directoryPath) 
    var filePaths: [String] = [] 

    while let filePath = enumerator?.nextObject() as? String { 

     if URL(fileURLWithPath: filePath).pathExtension == type { 
      filePaths.append(directoryPath.byAppending(pathComponent: filePath)) 
     } 
    } 
    return filePaths 
} 
Cuestiones relacionadas