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?
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?
Odpowiedzi:
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.
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)
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"
Pathname.new("some/path/to/my.file").basenameuzyskać my.file/: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz?
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"
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.
Wypróbuj ten kod
Posługiwać się extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
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"
Zauważ, że ciągi cudzysłowu uciekają.
'C:\projects\blah.dll'.split('\\').last
File.basename. I podobnie jak niektóre inne odpowiedzi, nie odpowiada na pytanie PO.
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+$/)