Cara mendapatkan nama file tanpa ekstensi dari jalur file di Ruby


233

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?


3
Ingatlah bahwa tidak ada yang istimewa dari sebuah titik yang diikuti oleh beberapa (tiga, mungkin) karakter. Mereka adalah bagian dari nama file. Beberapa sistem operasi pinggiran berpikir ada sesuatu yang istimewa tentang bagian nama file itu, tetapi Anda tidak boleh jatuh ke dalam perangkap itu.
James Moore

Jawaban:


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


86
Saya tidak tahu mengapa ini adalah jawaban peringkat # 1 ketika File.basename tidak memerlukan tambahan 'persyaratan' dari 'pathname'.
GroovyCakes

11
Class pathnamebekerja dengan nama path lokal sementara Fileselalu mengasumsikan nama path Unix (perbedaannya adalah path dan drive separator yang digunakan dalam MS Windows, misalnya)
nimrodm

3
Meskipun diterima oleh OP, jawaban ini sebenarnya tidak menanggapi pertanyaan OP. Lihat jawaban Jonathan Lonowski dan Arup Rakshit.
GSnyder

6
Perpanjangan hadir jika ada. Jawabannya salah.
Ludovic Kuty

4
Tolong jangan merusak posting Anda sendiri. Terima kasih!
NobodyNada

586

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"

Dengan Linux dan Ruby 1.8 saya mencoba Pathname.new("some/path/to/my.file").basenamedan mendapatkan my.file/: '(
java.is.for.desktop

67
Lebih umum lagi,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

Jawabannya harus menambahkan solusi @kelloti yang lebih baik.
ymoreau

@ Seloti: Bagaimana /my/file.tar.gz?
Richard-Degenne

56

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"

5
File.basename () adalah jawabannya!
sivabudh

26

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.


13

Coba kode ini

Menggunakan extname

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

8

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"

1
masalah dengan itu adalah bahwa Anda perlu tahu apakah itu backslash atau forwardslash
Joseph Le Brech

4

Perhatikan bahwa string tanda kutip ganda lolos.

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

5
Memperlakukannya murni sebagai string, bukan sebagai jalur, membuat kode lebih mudah dibawa-bawa.
boatcoder

Ini jauh lebih rumit daripada yang dibutuhkan, dan khusus untuk Windows. Anda bisa saja File.basename. Dan, seperti beberapa jawaban lainnya, tidak menjawab pertanyaan OP.
Keith Bennett

0

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

-5

Anda bisa mendapatkan jalur direktori ke skrip saat ini dengan:

File.dirname __FILE__

Pertanyaannya bukan tentang path, itu tentang nama file . "Bagaimana saya bisa mendapatkan nama file dari path file di Ruby?"
fontno

Itu akan menjadi:File.basename __FILE__
Samuel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.