Cel-C: Wyodrębnij nazwę pliku z ciągu ścieżki

251

Kiedy mam NSStringze /Users/user/Projects/thefile.extchcę wyodrębnić thefilemetodami Objective-C.

Jak najłatwiej to zrobić?

Anton
źródło
4
[ścieżka lastPathComponent] lub [[ścieżka pathComponents] lastObject]. Oba dają „thefile.ext”. Istnieje metoda [path pathExtension], aby uzyskać „ext”, ale nie to samo dla nazwy pliku.
Anton

Odpowiedzi:

598

Na podstawie odwołania do NSString możesz użyć:

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

lastPathComponentRozmowa powróci thefile.exti stringByDeletingPathExtensionbędzie usunąć przyrostek przedłużacz od końca.

Piotr
źródło
9
Nigdy nie słyszałem lastPathComponent. Dziękuję Ci!
Dimitris,
6
Innym rozwiązaniem byłoby połączenie tego i odpowiedzi Marca: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](użyj dowolnego menedżera plików, jaki chcesz). Zapewnia to poprawną lokalizację nazwy pliku i usunięcie rozszerzenia.
willurd
1
Dziękuję bardzo! To bardzo pomogło! W jaki sposób TYLKO byś otrzymał rozszerzenie?
20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown
Hej, to trochę po tej dyskusji, ale po prostu się zastanawiam. Jak mam odwrócić tę akcję? W końcu dodam trochę kodu do mojego programu, do którego mogę przeciągać i upuszczać plik. Jak zdobyć ŚCIEŻKĘ, aby mój komputer wiedział, do którego pliku uzyskać dostęp? Jak pobrać wprowadzony plik i uzyskać ścieżkę do pliku?
Christian Kreiter
37

Jeśli wyświetlasz nazwę pliku czytelną dla użytkownika, nie chcesz jej używać lastPathComponent. Zamiast tego przekaż pełną ścieżkę do displayNameAtPath:metody NSFileManager . Zasadniczo robi to samo, tylko poprawnie lokalizuje nazwę pliku i usuwa rozszerzenie na podstawie preferencji użytkownika.

Marc Charbonneau
źródło
1
W przypadku pakietów możesz użyć zamiast tego [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ „CFBundleName”]. displayNameAtPath zawiera rozszerzenie, w którym ten kod zwraca zlokalizowaną nazwę.
Peter N Lewis,
1
Nie zapomnij najpierw sprawdzić CFBundleDisplayName.
Peter Hosey
3

W ryzyku spóźnienia się o wiele lat i bez tematu - i pomimo doskonałej wiedzy @ Marc, w Swift wygląda to tak:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Chris Conover
źródło