Pamiętaj, że nie ma nic specjalnego w kropce, po której następują niektóre (trzy, być może) znaki. Są częścią nazwy pliku. Niektóre skrajne systemy operacyjne uważają, że jest coś wyjątkowego w tej części nazwy pliku, ale nie powinieneś wpadać w tę pułapkę.
Nie wiem, dlaczego jest to odpowiedź nr 1 w rankingu, gdy File.basename nie wymaga dodatkowego „wymagaj” „ścieżki”.
GroovyCakes
11
Klasa pathnamedziała z lokalnymi ścieżkami, a Filezawsze zakłada ścieżki uniksowe (różnica polega na separatorach ścieżek i napędów, które są używane na przykład w MS Windows)
nimrodm
3
Pomimo zaakceptowania przez PO odpowiedź ta w rzeczywistości nie odpowiada na pytanie PO. Zobacz odpowiedzi Jonathana Lonowskiego i Arupa Rakshita.
GSnyder
6
Rozszerzenie jest obecne, jeśli takie istnieje. Odpowiedź jest zła.
Zwraca ostatni składnik nazwy pliku podany w pliku nazwa_pliku, który musi zostać utworzony przy pomocy ukośników (`` / ''), niezależnie od separatora używanego w lokalnym systemie plików. Jeśli podany jest przyrostek i jest on obecny na końcu nazwy pliku, jest on usuwany.
Jonathan Lonowski odpowiedział doskonale, ale jest coś, czego nie ma w żadnej z wymienionych tutaj odpowiedzi. Zamiast tego File::extnamemożesz bezpośrednio użyć a, '.*'aby uzyskać nazwę pliku.
Traktuje go wyłącznie jako ciąg, a nie ścieżkę, co czyni kod mniej przenośnym.
Boatcoder
Jest to o wiele bardziej złożona niż jest to konieczne i jest specyficzna dla systemu Windows. Możesz po prostu File.basename. I podobnie jak niektóre inne odpowiedzi, nie odpowiada na pytanie PO.
Keith Bennett,
0
Jeśli masz dostęp do zmiennych ENV, w scanpołączeniu z tym małym wyrażeniem regularnym (który znajduje przedostatnie słowo, kropkę, a następnie ostatnie słowo ciągu) wstawi nazwę pliku do „filename”:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Oczywiście można użyć scanwyrażenia regularnego i wyrażenia regularnego dla dowolnej nazwy ścieżki zawierającej nazwę pliku i __FILE__jest to oczywisty wybór:
Odpowiedzi:
Dawno nie byłem użytkownikiem systemu Windows, ale rdoc Pathname mówi, że nie ma problemów z separatorami nazw katalogów w systemie Windows.
źródło
pathname
działa z lokalnymi ścieżkami, aFile
zawsze zakłada ścieżki uniksowe (różnica polega na separatorach ścieżek i napędów, które są używane na przykład w MS Windows)Próbować
File.basename
W Twoim przypadku:
źródło
Pathname.new("some/path/to/my.file").basename
uzyskaćmy.file/
: '(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?W przypadku, gdy rozszerzenie nie jest znane (wymaga separatora /):
źródło
Jonathan Lonowski odpowiedział doskonale, ale jest coś, czego nie ma w żadnej z wymienionych tutaj odpowiedzi. Zamiast tego
File::extname
możesz bezpośrednio użyć a,'.*'
aby uzyskać nazwę pliku.Ale jeśli chcesz uzyskać podstawową nazwę dowolnego określonego pliku rozszerzenia , musisz go użyć
File::extname
, w przeciwnym razie nie.źródło
Wypróbuj ten kod
Posługiwać się
extname
źródło
Odpowiedź Jonathona jest lepsza, ale powiadomienie
somelist[-1]
jest jedną zLastIndexOf
dostępnych notacji.Jak wspomniano krusty.ar,
somelist.last
najwyraźniej też jest.źródło
Zauważ, że ciągi cudzysłowu uciekają.
źródło
File.basename
. I podobnie jak niektóre inne odpowiedzi, nie odpowiada na pytanie PO.Jeśli masz dostęp do zmiennych ENV, w
scan
połączeniu z tym małym wyrażeniem regularnym (który znajduje przedostatnie słowo, kropkę, a następnie ostatnie słowo ciągu) wstawi nazwę pliku do „filename”:Oczywiście można użyć
scan
wyrażenia regularnego i wyrażenia regularnego dla dowolnej nazwy ścieżki zawierającej nazwę pliku i__FILE__
jest to oczywisty wybór:źródło
Możesz uzyskać ścieżkę katalogu do bieżącego skryptu za pomocą:
źródło
File.basename __FILE__