Jawaban ini tidak akurat. FILE adalah jalur "relatif" ke file dari direktori eksekusi saat ini - tidak absolut. Anda harus menggunakan File.expand_path ( FILE ) untuk mendapatkan jalur absolut
Luke Bayes
7
Garis bawah ganda secara otomatis dihapus dalam komentar di atas.
Luke Bayes
1
apakah ini masih berlaku di ruby 1.9.2?
Zasz
4
@Zasz Bekerja agak berbeda di 1.9.2. File yang awalnya dimuat memiliki __FILE__ relatif, tetapi file lain yang disertakan / diperlukan memiliki jalur absolut.
Geoff
9
@LukeBayes Anda dapat mempertahankan garis bawah dan karakter khusus lainnya dalam komentar Stack Overflow dengan mengelilingi teks literal dengan backtick. Menulis `__FILE__`untuk mendapatkan __FILE__.
Rory O'Kane
62
Nilai __FILE__adalah jalur relatif yang dibuat dan disimpan (tetapi tidak pernah diperbarui) ketika file Anda dimuat. Ini berarti bahwa jika Anda memiliki panggilan ke Dir.chdirtempat lain di aplikasi Anda, jalur ini akan berkembang secara tidak benar.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Salah satu solusi untuk masalah ini adalah untuk menyimpan nilai yang diperluas dari __FILE__luar kode aplikasi apa pun. Selama requirepernyataan Anda ada di bagian atas definisi Anda (atau setidaknya sebelum ada panggilan Dir.chdir), nilai ini akan terus berguna setelah mengubah direktori.
$MY_FILE_PATH =File.expand_path(File.dirname(__FILE__))# open class and do some stuff that changes directory
puts $MY_FILE_PATH
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.Jalur diperluas dengan benar di bawah pengujian saya. Versi ruby saya 2.3.7, mungkin versi ruby yang lebih baru memperbaiki masalah ini.
Alec.Zhou
28
__FILE__ adalah nama file dengan ekstensi file yang berisi kode yang dieksekusi.
Di foo.rb, __FILE__akan menjadi "foo.rb".
Jika foo.rbberada di dir /home/joshmaka File.dirname(__FILE__)akan kembali /home/josh.
Di Ruby, versi Windows, saya hanya memeriksa dan __FILE__tidak berisi path lengkap ke file. Sebaliknya itu berisi path ke file relatif ke tempat itu dieksekusi.
Dalam PHP __FILE__adalah path lengkap (yang menurut saya lebih disukai). Inilah sebabnya, untuk membuat jalur Anda portabel di Ruby, Anda benar-benar perlu menggunakan ini:
Saya harus mencatat bahwa di Ruby 1.9.1 __FILE__berisi path lengkap ke file, deskripsi di atas adalah ketika saya menggunakan Ruby 1.8.7.
Agar kompatibel dengan Ruby 1.8.7 dan 1.9.1 (tidak yakin tentang 1.9), Anda harus memerlukan file dengan menggunakan konstruk yang saya perlihatkan di atas.
Anda perlu menambahkan garis miring ke jalur relatif Anda:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Anda tidak boleh membuat hard-code pemisah direktori. Gunakan File.join sebagai gantinya: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Jawaban:
Ini adalah referensi ke nama file saat ini. Dalam file tersebut
foo.rb
,__FILE__
akan diartikan sebagai"foo.rb"
.Sunting: Ruby 1.9.2 dan 1.9.3 tampak berperilaku sedikit berbeda dari apa yang dikatakan Luke Bayes dalam komentarnya . Dengan file-file ini:
Menjalankan
ruby test.rb
akan menampilkansumber
`__FILE__`
untuk mendapatkan__FILE__
.Nilai
__FILE__
adalah jalur relatif yang dibuat dan disimpan (tetapi tidak pernah diperbarui) ketika file Anda dimuat. Ini berarti bahwa jika Anda memiliki panggilan keDir.chdir
tempat lain di aplikasi Anda, jalur ini akan berkembang secara tidak benar.Salah satu solusi untuk masalah ini adalah untuk menyimpan nilai yang diperluas dari
__FILE__
luar kode aplikasi apa pun. Selamarequire
pernyataan Anda ada di bagian atas definisi Anda (atau setidaknya sebelum ada panggilanDir.chdir
), nilai ini akan terus berguna setelah mengubah direktori.sumber
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
Jalur diperluas dengan benar di bawah pengujian saya. Versi ruby saya 2.3.7, mungkin versi ruby yang lebih baru memperbaiki masalah ini.__FILE__
adalah nama file dengan ekstensi file yang berisi kode yang dieksekusi.Di
foo.rb
,__FILE__
akan menjadi "foo.rb".Jika
foo.rb
berada di dir/home/josh
makaFile.dirname(__FILE__)
akan kembali/home/josh
.sumber
Di Ruby, versi Windows, saya hanya memeriksa dan
__FILE__
tidak berisi path lengkap ke file. Sebaliknya itu berisi path ke file relatif ke tempat itu dieksekusi.Dalam PHP
__FILE__
adalah path lengkap (yang menurut saya lebih disukai). Inilah sebabnya, untuk membuat jalur Anda portabel di Ruby, Anda benar-benar perlu menggunakan ini:Saya harus mencatat bahwa di Ruby 1.9.1
__FILE__
berisi path lengkap ke file, deskripsi di atas adalah ketika saya menggunakan Ruby 1.8.7.Agar kompatibel dengan Ruby 1.8.7 dan 1.9.1 (tidak yakin tentang 1.9), Anda harus memerlukan file dengan menggunakan konstruk yang saya perlihatkan di atas.
sumber
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )