¿Cómo hacer un nombre de ruta de unión segura en ruby?

189

Mi entorno de desarrollo de Rails está basado en Windows y mi entorno de producción está basado en Linux.

Es posible que se use VirtualHost. Suponga que un nombre de archivo necesita ser referenciado en la /publiccarpeta con File.open('/tmp/abc.txt', 'r').

—Pero en Windows debería estarlo C:\tmp\abc.txt. ¿Cómo puedo hacer una unión de ruta correcta para manejar los dos entornos diferentes?

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

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

Y cuando prefix_tmp_path = "C:\tmp\"llegueC:\tmp\/1.txt

¿Cuál es la forma correcta de manejar ambos casos?

Jirapong
fuente

Respuestas:

330

Recomiendo usar File.join

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

Una cosa a tener en cuenta. Ruby usa un "/" para el separador de archivos en todas las plataformas, incluido Windows, por lo que no necesita usar un código diferente para unir elementos en diferentes plataformas. "C: /tmp/1.text" debería funcionar bien.

File.join () es tu amigo para unir caminos.

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
fuente