Ziel-C: Extrahieren Sie den Dateinamen aus der Pfadzeichenfolge

251

Wenn ich NSStringmit /Users/user/Projects/thefile.exthabe, möchte ich thefilemit Objective-C-Methoden extrahieren .

Was ist der einfachste Weg, das zu tun?

Anton
quelle
4
[path lastPathComponent] oder [[path pathComponents] lastObject]. Beide geben 'thefile.ext'. Es gibt die Methode [path pathExtension], um 'ext' abzurufen, aber nicht die gleiche für den Dateinamen.
Anton

Antworten:

598

Aus der NSString-Referenz können Sie Folgendes verwenden:

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

Der lastPathComponentAnruf wird zurückgegeben thefile.extund stringByDeletingPathExtensiondas Erweiterungssuffix wird am Ende entfernt.

Peter
quelle
9
Ich habe noch nie davon gehört lastPathComponent. Danke dir!
Dimitris
6
Eine andere Lösung wäre eine Kombination aus dieser und Marc's Antworten: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](Verwenden Sie den gewünschten Dateimanager). Dadurch wird sichergestellt, dass der Dateiname korrekt lokalisiert ist und die Erweiterung entfernt wurde.
Willurd
1
Ich danke dir sehr! Das hat sehr geholfen! Wie würden Sie die Erweiterung NUR bekommen?
20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown
Hey, das ist ziemlich viel nach dieser Diskussion, aber ich frage mich nur etwas. Wie würde ich diese Aktion umkehren? Ich werde meinem Programm irgendwann Code hinzufügen, in den ich eine Datei ziehen und ablegen kann. Wie erhalte ich den PFAD SELBST, damit mein Computer weiß, auf welche Datei ich zugreifen kann? Wie nehme ich die eingegebene Datei und erhalte den Pfad der Datei?
Christian Kreiter
37

Wenn Sie einen vom Benutzer lesbaren Dateinamen anzeigen, möchten Sie diesen nicht verwenden lastPathComponent. Übergeben Sie stattdessen den vollständigen Pfad an die displayNameAtPath:Methode von NSFileManager . Dies macht im Grunde das Gleiche, nur dass der Dateiname korrekt lokalisiert und die Erweiterung basierend auf den Benutzereinstellungen entfernt wird.

Marc Charbonneau
quelle
1
Für Bundles möchten Sie möglicherweise stattdessen [[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"] verwenden. displayNameAtPath enthält die Erweiterung, in der dieser Code den lokalisierten Namen zurückgibt.
Peter N Lewis
1
Vergessen Sie nicht, zuerst nach CFBundleDisplayName zu suchen.
Peter Hosey
3

Auf die Gefahr hin, Jahre zu spät zu kommen und nicht zum Thema zu gehören - und trotz der hervorragenden Einsicht von @ Marc sieht es in Swift so aus:

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