Objective-C: Extrair nome do arquivo da cadeia de caminho

251

Quando eu tenho NSStringcom /Users/user/Projects/thefile.exteu quero extrair thefilecom métodos Objective-C.

Qual é a maneira mais fácil de fazer isso?

Anton
fonte
4
[path lastPathComponent] ou [[path pathComponents] lastObject]. Ambos fornece 'thefile.ext'. Existe o método [path pathExtension] para obter 'ext', mas não é o mesmo para o nome do arquivo.
Anton

Respostas:

598

Retirado da referência NSString , você pode usar:

NSString *theFileName = [[string lastPathComponent] stringByDeletingPathExtension];

A lastPathComponentchamada retornará thefile.exte stringByDeletingPathExtensionremoverá o sufixo do ramal do final.

Peter
fonte
9
Eu nunca ouvi falar lastPathComponent. Obrigado!
Dimitris
6
Outra solução seria uma combinação disso e das respostas de Marc: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](use o gerenciador de arquivos que desejar). Isso garante que o nome do arquivo seja localizado corretamente e que a extensão foi removida.
willurd
1
Muito obrigado! Isso ajudou muito! Como você APENAS obteria a extensão?
20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown
Ei, isso é um pouco depois dessa discussão, mas estou apenas pensando em algo. Como eu reverteria essa ação? Acabarei adicionando algum código ao meu programa para onde posso arrastar e soltar um arquivo. Como obtenho o PATH PRÓPRIO, para que meu computador saiba qual arquivo acessar? Como pego o arquivo digitado e obtenho o caminho do arquivo?
Christian Kreiter
37

Se você estiver exibindo um nome de arquivo legível pelo usuário, não deseja usá-lo lastPathComponent. Em vez disso, passe o caminho completo para o displayNameAtPath:método do NSFileManager . Isso basicamente faz a mesma coisa, apenas localiza o nome do arquivo corretamente e remove a extensão com base nas preferências do usuário.

Marc Charbonneau
fonte
1
Para pacotes configuráveis, convém usar [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"]. displayNameAtPath inclui a extensão em que esse código retorna o nome localizado.
9139 Peter N Lewis
1
Não se esqueça de verificar primeiro o CFBundleDisplayName.
9789 Peter Hosey
3

Correndo o risco de ficar anos atrasado e fora do tópico - e não obstante a excelente visão de @ Marc, em Swift, parece:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Chris Conover
fonte