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.