Objetivo-C: extraer el nombre de archivo de la cadena de ruta


251

Cuando tengo NSStringcon /Users/user/Projects/thefile.extquiero extraer thefilecon métodos Objective-C.

Cual es la forma mas fácil de hacer eso?


44
[path lastPathComponent] o [[path pathComponents] lastObject]. Ambos dan 'thefile.ext'. Hay un método [path pathExtension] para obtener 'ext' pero no es lo mismo para el nombre de archivo.
Anton

Respuestas:


598

Tomado de la referencia NSString , puede usar:

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

La lastPathComponentllamada volverá thefile.exty stringByDeletingPathExtensioneliminará el sufijo de extensión del final.


99
Nunca oí hablar de eso lastPathComponent. ¡Gracias!
Dimitris

66
Otra solución sería una combinación de esto y las respuestas de Marc: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](use el administrador de archivos que desee). Esto garantiza que el nombre de archivo se localice correctamente y que la extensión se haya eliminado.
willurd

1
Muchas gracias! ¡Esto ayudó mucho! Sin embargo, ¿cómo SOLO obtendrías la extensión?

20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown

Oye, esto es bastante después de esta discusión, pero me pregunto algo. ¿Cómo revertiría esta acción? Eventualmente agregaré algún código a mi programa donde pueda arrastrar y soltar un archivo. ¿Cómo obtengo la RUTA MISMA, para que mi computadora pueda saber a qué archivo acceder? ¿Cómo tomo el archivo ingresado y obtengo la ruta del archivo?
Christian Kreiter

37

Si está mostrando un nombre de archivo legible por el usuario, no desea usarlo lastPathComponent. En su lugar, pase la ruta completa al displayNameAtPath:método NSFileManager . Esto básicamente hace lo mismo, solo que localiza correctamente el nombre del archivo y elimina la extensión en función de las preferencias del usuario.


1
Para paquetes, es posible que desee utilizar [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"] en su lugar. displayNameAtPath incluye la extensión donde este código devuelve el nombre localizado.
Peter N Lewis

1
No olvide verificar primero CFBundleDisplayName.
Peter Hosey

3

A riesgo de llegar años tarde y fuera de tema, y ​​a pesar de la excelente visión de @ Marc, en Swift parece que:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.