Jak uzyskać nazwę pliku bez rozszerzenia ze ścieżki pliku w Ruby


233

Jak mogę uzyskać nazwę pliku ze ścieżki pliku w Ruby?

Na przykład, jeśli mam ścieżkę "C:\projects\blah.dll"i chcę tylko „bla”.

Czy istnieje LastIndexOfmetoda w Ruby?


3
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ę.
James Moore

Odpowiedzi:


94
require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

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.


86
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.
Ludovic Kuty

4
Nie niszcz swoich własnych postów. Dzięki!
NobodyNada

586

Próbować File.basename

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.

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

W Twoim przypadku:

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"

W systemach Linux i Ruby 1.8 próbuję Pathname.new("some/path/to/my.file").basenameuzyskać my.file/: '(
java.is.for.desktop

67
Bardziej ogólnie,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

Odpowiedzią powinno być dodanie rozwiązania @kelloti, które jest lepsze.
ymoreau

@kelloti: A co z /my/file.tar.gz?
Richard-Degenne,

56

W przypadku, gdy rozszerzenie nie jest znane (wymaga separatora /):

irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"

5
File.basename () to odpowiedź!
sivabudh

26

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.

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"

Ale jeśli chcesz uzyskać podstawową nazwę dowolnego określonego pliku rozszerzenia , musisz go użyć File::extname, w przeciwnym razie nie.


13

Wypróbuj ten kod

Posługiwać się extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 

8

Odpowiedź Jonathona jest lepsza, ale powiadomienie somelist[-1]jest jedną z LastIndexOfdostępnych notacji.

Jak wspomniano krusty.ar, somelist.lastnajwyraźniej też jest.

irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"

1
problem polega na tym, że musisz wiedzieć, czy jest to odwrotny czy lewy
Joseph Le Brech,

4

Zauważ, że ciągi cudzysłowu uciekają.

'C:\projects\blah.dll'.split('\\').last

5
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:

__FILE__.scan(/\w+\.\w+$/)

-5

Możesz uzyskać ścieżkę katalogu do bieżącego skryptu za pomocą:

File.dirname __FILE__

Pytanie nie dotyczyło ścieżki, lecz nazwy pliku . „Jak mogę uzyskać nazwę pliku ze ścieżki pliku w Ruby?”
fontno

To byłoby:File.basename __FILE__
Samuel
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.