Bagaimana saya bisa mendapatkan nama file dari jalur file di Ruby?
Sebagai contoh jika saya memiliki jalur "C:\projects\blah.dll"dan saya hanya ingin "bla".
Apakah ada LastIndexOfmetode di Ruby?
Bagaimana saya bisa mendapatkan nama file dari jalur file di Ruby?
Sebagai contoh jika saya memiliki jalur "C:\projects\blah.dll"dan saya hanya ingin "bla".
Apakah ada LastIndexOfmetode di Ruby?
Jawaban:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Saya belum pernah menjadi pengguna Windows dalam waktu yang lama, tetapi Pathdoc rdoc mengatakan tidak memiliki masalah dengan pemisah nama direktori pada Windows.
pathnamebekerja dengan nama path lokal sementara Fileselalu mengasumsikan nama path Unix (perbedaannya adalah path dan drive separator yang digunakan dalam MS Windows, misalnya)
Mencoba File.basename
Mengembalikan komponen terakhir dari nama file yang diberikan dalam file_name, yang harus dibentuk menggunakan garis miring (`` / '') terlepas dari pemisah yang digunakan pada sistem file lokal. Jika suffix diberikan dan hadir di akhir file_name, sufiks dihapus.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
Dalam kasus Anda:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basenamedan mendapatkan my.file/: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz?
Jika ekstensi tidak diketahui (perlu / pemisah):
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 menjawab dengan sempurna, tetapi ada sesuatu yang tidak ada jawaban yang disebutkan di sini. Alih-alih File::extname, Anda dapat langsung menggunakan '.*'untuk mendapatkan nama file.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Tetapi, jika Anda ingin mendapatkan nama file dasar dari setiap file ekstensi tertentu , maka Anda harus menggunakan File::extname, jika tidak, tidak.
Coba kode ini
Menggunakan extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
Jawaban Jonathon lebih baik, tetapi memberi tahu Anda somelist[-1]adalah salah satu dari LastIndexOfnotasi yang tersedia.
Seperti disebutkan krusty.ar somelist.lasttampaknya juga.
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"
Perhatikan bahwa string tanda kutip ganda lolos.
'C:\projects\blah.dll'.split('\\').last
File.basename. Dan, seperti beberapa jawaban lainnya, tidak menjawab pertanyaan OP.
Jika Anda memiliki akses ke variabel ENV, scandikombinasikan dengan regex kecil ini (yang menemukan kata terakhir tapi satu, titik, maka kata terakhir dari string) akan memasukkan nama file ke 'nama file':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Jelas, Anda dapat menggunakan scandan regex pada nama jalur apa pun yang menyertakan nama file, dan __FILE__merupakan pilihan yang jelas:
__FILE__.scan(/\w+\.\w+$/)