Por alguna loca razón, no puedo encontrar una manera de obtener una lista de archivos con un globo para un directorio dado.
Actualmente estoy atrapado con algo en la línea de:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager]
directoryContentsAtPath:bundleRoot];
..y luego quitar las cosas que no quiero, lo que apesta. Pero lo que realmente me gustaría es poder buscar algo como "foo * .jpg" en lugar de preguntar por el directorio completo, pero no he podido encontrar algo así.
Entonces, ¿cómo diablos lo haces?
ios
objective-c
iphone
cocoa
cocoa-touch
sammich
fuente
fuente

Respuestas:
Puede lograr esto fácilmente con la ayuda de NSPredicate, así:
Si necesita hacerlo con NSURL, se ve así:
fuente
Esto funciona bastante bien
IOS, pero también debería funcionarcocoa.fuente
¿Qué pasa con el uso de los métodos hasSuffix y hasPrefix de NSString? Algo así como (si está buscando "foo * .jpg"):
Para coincidencias simples y directas como esa, sería más simple que usar una biblioteca de expresiones regulares.
fuente
contentsOfDirectoryAtPath:error:lugar dedirectoryContentsAtPathporque esdeprecateddesdeiOS2.0Método muy simple:
fuente
Unix tiene una biblioteca que puede realizar operaciones de globalización de archivos por usted. Las funciones y los tipos se declaran en un encabezado llamado
glob.h, por lo que deberá#includehacerlo. Si abre un terminal y abra la página de manual de glob escribiendoman 3 glob, obtendrá toda la información que necesita saber para usar las funciones.A continuación se muestra un ejemplo de cómo podría llenar una matriz de archivos que coinciden con un patrón global. Cuando utilice la
globfunción, debe tener en cuenta algunas cosas.globfunción busca archivos en el directorio de trabajo actual. Para buscar en otro directorio, deberá anteponer el nombre del directorio al patrón global como lo hice en mi ejemplo para obtener todos los archivos/bin.globllamandoglobfreecuando haya terminado con la estructura.En mi ejemplo, uso las opciones predeterminadas y no hay devolución de llamada de error. La página de manual cubre todas las opciones en caso de que haya algo allí que desee usar. Si va a utilizar el código anterior, le sugiero agregarlo como una categoría
NSArrayo algo así.Editar: he creado una esencia en github que contiene el código anterior en una categoría llamada NSArray + Globbing .
fuente
stringWithCString:es obsoleto. El reemplazo correcto es-[NSFileManager stringWithFileSystemRepresentation:length:], aunque creo que la mayoría de la gente lo usastringWithUTF8String:(lo cual es más fácil pero no garantiza que sea la codificación correcta).Necesita rodar su propio método para eliminar los archivos que no desea.
Esto no es fácil con las herramientas integradas, pero podría usar RegExKit Lite para ayudar a encontrar los elementos en la matriz devuelta que le interese. De acuerdo con las notas de la versión, esto debería funcionar en las aplicaciones Cocoa y Cocoa-Touch.
Aquí está el código de demostración que escribí en unos 10 minutos. Cambié el <y> a "porque no se mostraban dentro del bloque previo, pero aún funciona con las comillas. Quizás alguien que sepa más sobre formatear código aquí en StackOverflow lo corrija (¿Chris?).
Este es un proyecto de plantilla de la herramienta de línea de comandos "Herramienta básica". Si tengo mi git daemon funcionando en mi servidor de inicio, editaré esta publicación para agregar la URL del proyecto.
#import "Foundation / Foundation.h" #import "RegexKit / RegexKit.h" @interface MTFileMatcher: NSObject { } - (nulo) getFilesMatchingRegEx: (NSString *) inRegex forPath: (NSString *) inPath; @final int main (int argc, const char * argv []) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // inserta el código aquí ... MTFileMatcher * matcher = [[[MTFileMatcher alloc] init] autorelease]; [matcher getFilesMatchingRegEx: @ "^. + \\. [Jj] [Pp] [Ee]? [Gg] $" forPath: [@ "~ / Pictures" stringByExpandingTildeInPath]]; [drenaje de la piscina]; devuelve 0; } @implementation MTFileMatcher - (nulo) getFilesMatchingRegEx: (NSString *) inRegex forPath: (NSString *) inPath; { NSArray * filesAtPath = [[[NSFileManager defaultManager] directorioContentsAtPath: inPath] arrayByMatchingObjectsWithRegex: inRegex]; NSEnumerator * itr = [filesAtPath objectEnumerator]; NSString * obj; while (obj = [itr nextObject]) { NSLog (obj); } } @finalfuente
No pretendo ser un experto en el tema, pero debes tener acceso a ambos
globywordexpla función de Objective-C, no?fuente
stringWithFileSystemRepresentation no parece estar disponible en iOS.
fuente
Swift 5
Esto funciona para el cacao.
fuente
Swift 5 para cacao
fuente