Por alguma razão maluca, não consigo encontrar uma maneira de obter uma lista de arquivos com um glob para um determinado diretório.
Atualmente, estou preso a algo como:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager]
directoryContentsAtPath:bundleRoot];
..e depois retirar as coisas que eu não quero, o que é uma merda. Mas o que eu realmente gostaria é poder procurar algo como "foo * .jpg" em vez de solicitar o diretório inteiro, mas não consegui encontrar nada parecido.
Então, como diabos você faz isso?
ios
objective-c
iphone
cocoa
cocoa-touch
sammich
fonte
fonte
Respostas:
Você pode conseguir isso facilmente com a ajuda do NSPredicate, da seguinte forma:
Se você precisar fazer isso com o NSURL, será assim:
fonte
Isso funciona muito bem para
IOS
, mas também deve funcionarcocoa
.fonte
Que tal usar os métodos hasSuffix e hasPrefix do NSString? Algo como (se você estiver procurando por "foo * .jpg"):
Para correspondências simples e diretas como essa, seria mais simples do que usar uma biblioteca regex.
fonte
contentsOfDirectoryAtPath:error:
vez dedirectoryContentsAtPath
porque édeprecated
desdeiOS
2.0 #Método muito mais simples:
fonte
O Unix possui uma biblioteca que pode executar operações de globbing de arquivos para você. As funções e os tipos são declarados em um cabeçalho chamado
glob.h
, então você precisará#include
disso. Se abrir um terminal e abrir a página de manual do glob digitando,man 3 glob
você obterá todas as informações necessárias para usar as funções.Abaixo está um exemplo de como você pode preencher uma matriz com os arquivos que correspondem a um padrão de globbing. Ao usar a
glob
função, lembre-se de algumas coisas.glob
função procura por arquivos no diretório de trabalho atual. Para pesquisar em outro diretório, você precisará acrescentar o nome do diretório ao padrão globbing, como fiz no exemplo para obter todos os arquivos/bin
.glob
chamandoglobfree
quando terminar a estrutura.No meu exemplo, eu uso as opções padrão e nenhum retorno de chamada de erro. A página de manual cobre todas as opções, caso haja algo que você queira usar. Se você usar o código acima, sugiro adicioná-lo como uma categoria
NSArray
ou algo parecido.Edit: Eu criei uma essência no github que contém o código acima em uma categoria chamada NSArray + Globbing .
fonte
stringWithCString:
está obsoleto. A substituição correta é-[NSFileManager stringWithFileSystemRepresentation:length:]
, embora eu ache que a maioria das pessoas usastringWithUTF8String:
(o que é mais fácil, mas não é garantido que seja a codificação correta).Você precisa rolar seu próprio método para eliminar os arquivos que não deseja.
Isso não é fácil com as ferramentas integradas, mas você pode usar RegExKit Lite para ajudar a encontrar os elementos na matriz retornada em que está interessado. De acordo com as notas de versão, isso deve funcionar nos aplicativos Cocoa e Cocoa-Touch.
Aqui está o código de demonstração que escrevi em cerca de 10 minutos. Alterei <e> para "porque eles não estavam aparecendo dentro do pré-bloco, mas ainda funciona com as aspas. Talvez alguém que saiba mais sobre a formatação do código aqui no StackOverflow corrija isso (Chris?).
Este é um projeto de modelo do Utilitário de Linha de Comando da "Foundation Tool". Se eu instalar o meu daemon git no meu servidor doméstico, editarei esta postagem para adicionar a URL do projeto.
fonte
Não vou fingir ser um especialista no assunto, mas você deve ter acesso às funções from
glob
ewordexp
do objetivo-c, não?fonte
stringWithFileSystemRepresentation não parece estar disponível no iOS.
fonte
Swift 5
Isso funciona para o cacau
fonte
Swift 5 para cacau
fonte