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.
Saya belum pernah menjadi pengguna Windows dalam waktu yang lama, tetapi Pathdoc rdoc mengatakan tidak memiliki masalah dengan pemisah nama direktori pada Windows.
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!
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.
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.
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:
Jawaban:
Saya belum pernah menjadi pengguna Windows dalam waktu yang lama, tetapi Pathdoc rdoc mengatakan tidak memiliki masalah dengan pemisah nama direktori pada Windows.
sumber
pathname
bekerja dengan nama path lokal sementaraFile
selalu mengasumsikan nama path Unix (perbedaannya adalah path dan drive separator yang digunakan dalam MS Windows, misalnya)Mencoba
File.basename
Dalam kasus Anda:
sumber
Pathname.new("some/path/to/my.file").basename
dan mendapatkanmy.file/
: '(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?Jika ekstensi tidak diketahui (perlu / pemisah):
sumber
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.Tetapi, jika Anda ingin mendapatkan nama file dasar dari setiap file ekstensi tertentu , maka Anda harus menggunakan
File::extname
, jika tidak, tidak.sumber
Coba kode ini
Menggunakan
extname
sumber
Jawaban Jonathon lebih baik, tetapi memberi tahu Anda
somelist[-1]
adalah salah satu dariLastIndexOf
notasi yang tersedia.Seperti disebutkan krusty.ar
somelist.last
tampaknya juga.sumber
Perhatikan bahwa string tanda kutip ganda lolos.
sumber
File.basename
. Dan, seperti beberapa jawaban lainnya, tidak menjawab pertanyaan OP.Jika Anda memiliki akses ke variabel ENV,
scan
dikombinasikan dengan regex kecil ini (yang menemukan kata terakhir tapi satu, titik, maka kata terakhir dari string) akan memasukkan nama file ke 'nama file':Jelas, Anda dapat menggunakan
scan
dan regex pada nama jalur apa pun yang menyertakan nama file, dan__FILE__
merupakan pilihan yang jelas:sumber
Anda bisa mendapatkan jalur direktori ke skrip saat ini dengan:
sumber
File.basename __FILE__