Bagaimana cara bergabung aman pathname di ruby?


189

Lingkungan pengembangan My Rails berbasis Windows, dan lingkungan produksi saya berbasis Linux.

Mungkin VirtualHost akan digunakan. Asumsikan satu nama file perlu direferensikan dalam /publicfolder dengan File.open('/tmp/abc.txt', 'r').

—Tapi di Windows seharusnya begitu C:\tmp\abc.txt. Bagaimana saya bisa melakukan jalur bergabung yang benar untuk menangani dua lingkungan yang berbeda?

prefix_tmp_path = '/tmp/'
filename = "/#{rand(10)}.txt"

fullname = prefix_tmp_path + filename # /tmp//1.txt <- but I don't want a double //

Dan saat prefix_tmp_path = "C:\tmp\"saya mendapatkannyaC:\tmp\/1.txt

Apa cara yang benar untuk menangani kedua kasus?

Jawaban:


330

Saya sarankan menggunakan File.join

>> File.join("path", "to", "join")
=> "path/to/join"

51

Satu hal yang perlu diperhatikan. Ruby menggunakan "/" untuk pemisah file di semua platform, termasuk Windows, jadi Anda sebenarnya tidak perlu menggunakan kode yang berbeda untuk menggabungkan berbagai hal pada platform yang berbeda. "C: /tmp/1.text" seharusnya berfungsi dengan baik.

File.join () adalah teman Anda untuk menggabungkan jalur.

prefix_tmp_path = 'C:/tmp'
filename = "#{rand(10)}.txt"
fullname = File.join(prefix_tmp_path, filename) # e.g., C:/tmp/3.txt
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.