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ć?


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.