Ruby'deki dosya yolundan uzantı olmadan dosya adı nasıl alınır


233

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


3
Bir nokta hakkında özel bir şeyin ardından bazı (üç, belki) karakterin gelmediğini unutmayın. Bunlar dosya adının bir parçasıdır. Bazı yan işletim sistemleri, dosya adının o kısmı hakkında özel bir şey olduğunu düşünür, ancak bu tuzağa düşmemelisiniz.
James Moore

Yanıtlar:


94
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.


86
File.basename 'pathname' için fazladan bir 'gereksinim' gerektirmediğinde neden bu # 1 sıralı cevap olduğunu bilmiyorum.
GroovyCakes

11
Sınıf 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)
nimrodm

3
OP tarafından kabul edilmesine rağmen, bu cevap aslında OP'nin sorusuna cevap vermiyor. Jonathan Lonowski ve Arup Rakshit'in cevaplarını görün.
GSnyder

6
Eğer varsa uzantı mevcuttur. Cevap yanlış.
Ludovic Kuty

4
Lütfen kendi yayınlarınızı tahrip etmeyin. Teşekkürler!
NobodyNada

586

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"

Linux ve Ruby 1.8 ile ben denemek Pathname.new("some/path/to/my.file").basenameve almak my.file/: '(
java.is.for.desktop

67
Daha genel olarak,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

Cevap daha iyi olan @ kelloti'nin çözümünü eklemek olmalıdır.
ymoreau

@kelloti: Ne olmuş /my/file.tar.gz?
Richard-Degenne

56

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"

5
Cevap dosya.basename ()!
sivabudh

26

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 .


13

Bu kodu deneyin

kullanım extname

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

8

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"

1
sorun, bunun ters eğik çizgi veya ters eğik çizgi olduğunu bilmeniz gerektiğidir
Joseph Le Brech

4

Unutmayın çift tırnaklar dizeleri kaçış \ 's.

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

5
Bir yol yerine, yalnızca bir dize gibi davranır, kodu daha az taşınabilir hale getirir.
boatcoder

Bu, gerekenden çok daha karmaşıktır ve Windows'a özgüdür. Sadece yapabilirsin File.basename. Ve diğer bazı cevaplar gibi OP'nin sorusuna cevap vermiyor.
Keith Bennett

0

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+$/)

-5

Şu anki komut dosyasına dizin yolunu aşağıdaki yollarla alabilirsiniz:

File.dirname __FILE__

Soru yolla değil, dosya adıyla ilgiliydi . " Dosya adını Ruby'deki bir dosya yolundan nasıl alabilirim ?"
fontno

Bu şöyle olurdu:File.basename __FILE__
Samuel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.