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?

Anton
fuente
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.

Peter
fuente
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.

Marc Charbonneau
fuente
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
Chris Conover
fuente