136 votos

Obtener una lista de los archivos en un directorio con un pegote

Por alguna loca razón no puedo encontrar una manera para obtener una lista de archivos con un pegote de un directorio dado.

Actualmente estoy atascado con algo a lo largo de las líneas de:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] 
                        directoryContentsAtPath:bundleRoot];

..y, a continuación, excluyendo las cosas que no me quiere, que apesta. Pero lo que realmente me gustaría es ser capaz de buscar algo así como "foo*.jpg" en lugar de pedir para todo el directorio, pero no he sido capaz de encontrar nada de eso.

Así que, ¿cómo diablos lo hace?

240voto

Brian Webster Puntos 7516

Esto se puede lograr muy fácilmente con la ayuda de NSPredicate, así:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil];
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"];
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr];

Si usted necesita hacer con NSURL lugar se parece a esto:

NSURL *bundleRoot = [[NSBundle mainBundle] bundleURL];
NSArray * dirContents = 
      [fm contentsOfDirectoryAtURL:bundleRoot
        includingPropertiesForKeys:@[] 
                           options:NSDirectoryEnumerationSkipsHiddenFiles
                             error:nil];
NSPredicate * fltr = [NSPredicate predicateWithFormat:@"pathExtension='jpg'"];
NSArray * onlyJPGs = [directoryContents filteredArrayUsingPredicate:predicate];

34voto

Matt Puntos 159

Esto funciona muy bien para IOS, pero también debe funcionar para cocoa.

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSFileManager *manager = [NSFileManager defaultManager];
NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot];
NSString *filename;

while ((filename = [direnum nextObject] )) {

    //change the suffix to what you are looking for
    if ([filename hasSuffix:@".data"]) {   

        // Do work here            
    }       
}

28voto

John Biesnecker Puntos 2138

¿Qué acerca del uso NSString del hasSuffix y hasPrefix métodos? Algo así como (si lo que estás buscando "foo*.jpg"):

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot];
for (NSString *tString in dirContents) {
    if ([tString hasPrefix:@"foo"] && [tString hasSuffix:@".jpg"]) {

        // do stuff

    }
}

Simple, directo, partidos como que sería más sencillo que el uso de una expresión regular de la biblioteca.

10voto

Bryan Kyle Puntos 5931

Unix dispone de una biblioteca que puede realizar el archivo de esta expansión de las operaciones para usted. Las funciones y los tipos se declaran en un encabezado denominado glob.h, por lo que necesitará #include . Si abre un terminal abierto la página man para glob escribiendo man 3 glob obtendrá toda la información que usted necesita saber para utilizar las funciones.

A continuación es un ejemplo de cómo se podría llenar una matriz de los archivos que coincidan con un patrón de englobamiento. Cuando se utiliza la glob función, hay algunas cosas que usted necesita para tener en cuenta.

  1. De forma predeterminada, la glob función busca los archivos en el directorio de trabajo actual. Con el fin de buscar otro directorio deberás anteponer el nombre de directorio para el patrón de englobamiento como yo he hecho en mi ejemplo para obtener todos los archivos en /bin.
  2. Usted es responsable de la limpieza de la memoria asignada por glob llamando globfree cuando hayas terminado con la estructura.

En mi ejemplo yo uso las opciones por defecto y no hay error de devolución de llamada. El hombre de la página incluye todas las opciones en caso de que haya algo ahí que desea utilizar. Si vas a utilizar el código de arriba, me gustaría sugerir la adición como una categoría a NSArray o algo así.

NSMutableArray* files = [NSMutableArray array];
glob_t gt;
char* pattern = "/bin/*";
if (glob(pattern, 0, NULL, &gt) == 0) {
    int i;
    for (i=0; i<gt.gl_matchc; i++) {
        [files addObject: [NSString stringWithCString: gt.gl_pathv[i]]];
    }
}
globfree(&gt);
return [NSArray arrayWithArray: files];

Edit: he creado un gist en github que contiene el código de arriba en una categoría llamada NSArray+Englobamiento.

5voto

Mark Puntos 4786

Usted necesita para rodar su propio método para eliminar los archivos que no quieras.

Esto no es fácil con la construcción de herramientas, pero se puede usar RegExKit Lite para ayudar con la búsqueda de los elementos en el array devuelto usted está interesado en. De acuerdo a las notas de la versión, esto debe funcionar en ambos Cacao y Cocoa-Touch aplicaciones.

Aquí está la demo de código que escribí en unos 10 minutos. He cambiado la < y > para " debido a que no aparecían en el interior de la pre bloque, pero todavía funciona con las comillas. Tal vez alguien que sepa más acerca de código de formato aquí en StackOverflow va a corregir este (Chris?).

Esta es una "Fundación" Herramienta de Línea de Comandos de la Utilidad de la plantilla de proyecto. Si puedo obtener mi demonio git en marcha y funcionando en mi casa servidor que voy a editar este post para agregar la dirección URL para el proyecto.

#import "Foundation/Foundation.h"
#import "RegexKit/RegexKit.h"

@interfaz MTFileMatcher : NSObject 
{
}
- (void)getFilesMatchingRegEx:(NSString*)inRegex forPath:(NSString*)inPath;
@final

int main (int argc, const char * argv[])
{
 NSAutoreleasePool * piscina = [[NSAutoreleasePool alloc] init];

 // introducir aquí el código de...
 MTFileMatcher* comparador = [[[MTFileMatcher alloc] init] grupo de liberación automática];
 [comparador getFilesMatchingRegEx:@"^.+\\.[Jj][Pp][Ee]?[Gg]$" forPath:[@"~/Pictures" stringByExpandingTildeInPath]];

 [de la piscina de drenaje];
 return 0;
}

@implementación MTFileMatcher
- (void)getFilesMatchingRegEx:(NSString*)inRegex forPath:(NSString*)inPath;
{
 NSArray* filesAtPath = [[[NSFileManager defaultManager] directoryContentsAtPath:inPath] arrayByMatchingObjectsWithRegex:inRegex];
 NSEnumerator* itr = [filesAtPath objectEnumerator];
 NSString* obj;
 mientras (obj = [itr nextObject])
{
NSLog(obj);
}
}
@final

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X