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?

Jirapong
sumber

Jawaban:

330

Saya sarankan menggunakan File.join

>> File.join("path", "to", "join")
=> "path/to/join"
csexton
sumber
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
Daniel Von Fange
sumber