Objective-C: extraire le nom de fichier de la chaîne de chemin

251

Quand j'ai NSStringavec /Users/user/Projects/thefile.extje veux extraire thefileavec des méthodes Objective-C.

Quelle est la façon la plus simple de procéder?

Anton
la source
4
[path lastPathComponent] ou [[path pathComponents] lastObject]. Les deux donnent «thefile.ext». Il existe une méthode [path pathExtension] pour obtenir 'ext' mais pas la même chose pour le nom de fichier.
Anton

Réponses:

598

Tiré de la référence NSString , vous pouvez utiliser:

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

L' lastPathComponentappel reviendra thefile.extet stringByDeletingPathExtensionsupprimera le suffixe d'extension de la fin.

Peter
la source
9
Je n'en ai jamais entendu parler lastPathComponent. Je vous remercie!
Dimitris
6
Une autre solution serait une combinaison de cela et des réponses de Marc: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](utilisez le gestionnaire de fichiers que vous voulez). Cela garantit que le nom de fichier est correctement localisé et que l'extension a été supprimée.
willurd
1
Merci beaucoup! Cela a beaucoup aidé! Comment obtiendriez-vous JUSTEMENT l'extension?
20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown
Hé, c'est un peu après cette discussion, mais je me demande juste quelque chose. Comment pourrais-je inverser cette action? J'ajouterai éventuellement du code à mon programme à l'endroit où je pourrai glisser-déposer un fichier. Comment puis-je obtenir le CHEMIN D'ACCÈS, afin que mon ordinateur sache à quel fichier accéder? Comment prendre le fichier entré et obtenir le chemin du fichier?
Christian Kreiter
37

Si vous affichez un nom de fichier lisible par l' utilisateur, vous ne pas souhaitez utiliser lastPathComponent. Au lieu de cela, passez le chemin d'accès complet à la displayNameAtPath:méthode NSFileManager . Cela fait essentiellement la même chose, mais il localise correctement le nom de fichier et supprime l'extension en fonction des préférences de l'utilisateur.

Marc Charbonneau
la source
1
Pour les ensembles, vous pouvez utiliser à la place [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"]. displayNameAtPath inclut l'extension où ce code renvoie le nom localisé.
Peter N Lewis
1
N'oubliez pas de vérifier d'abord CFBundleDisplayName.
Peter Hosey
3

Au risque d'être des années en retard et hors sujet - et malgré l'excellente perspicacité de @ Marc, dans Swift, cela ressemble à:

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