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.