Dosya adını Ruby'deki bir dosya yolundan nasıl alabilirim?
Mesela bir yolum varsa "C:\projects\blah.dll"ve sadece "falan" istiyorum.
LastIndexOfRuby'de bir yöntem var mı ?
Dosya adını Ruby'deki bir dosya yolundan nasıl alabilirim?
Mesela bir yolum varsa "C:\projects\blah.dll"ve sadece "falan" istiyorum.
LastIndexOfRuby'de bir yöntem var mı ?
Yanıtlar:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Uzun zamandır Windows kullanıcısı değilim, ancak Pathname rdoc, Windows'ta dizin adı ayırıcılarıyla ilgili bir sorun olmadığını söylüyor.
pathnameederken yerel pathnames ile çalışır Filehep Unix pathnames varsayar (MS Windows kullanılan farktır yol ve sürücü ayırıcılar, örneğin)
Deneyin File.basename
Yerel dosya sisteminde kullanılan ayırıcıdan bağımsız olarak eğik çizgi (`` / '') kullanılarak oluşturulması gereken dosya_adı içinde verilen dosya adının son bileşenini döndürür. Dosya_adı sonunda bir son ek verilir ve varsa, kaldırılır.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
Senin durumunda:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basenameve almak my.file/: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz?
Uzantının bilinmemesi durumunda (/ ayırıcısına ihtiyaç duyar):
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 mükemmel cevap verdi, ancak burada cevapların hiçbirinin belirtmediği bir şey var. Bunun yerine, File::extnamedoğrudan '.*'dosya adını almak için a kullanabilirsiniz .
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Ancak, belirli bir uzantı dosyasının temel dosya adını almak istiyorsanız File::extname, aksi takdirde kullanmanız gerekir .
Bu kodu deneyin
kullanım extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
Jonathon'un cevabı daha iyidir, ancak size bildirmek somelist[-1]için LastIndexOfmevcut gösterimlerden biridir .
somelist.lastGörünüşe göre krusty.ar da belirtildiği gibi .
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"
Unutmayın çift tırnaklar dizeleri kaçış \ 's.
'C:\projects\blah.dll'.split('\\').last
File.basename. Ve diğer bazı cevaplar gibi OP'nin sorusuna cevap vermiyor.
ENV değişkenlerine erişiminiz varsa, scanbu küçük regex ile birlikte (son ancak bir kelimeyi, bir noktayı, sonra dizenin son sözcüğünü bulur) dosyanın adını 'dosya adına' koyacaktır:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Açıkçası, scanve regex'i dosya adını içeren herhangi bir yol adında kullanabilirsiniz ve __FILE__bariz seçimdir:
__FILE__.scan(/\w+\.\w+$/)