Как сделать безопасное объединение путей в ruby? - PullRequest
164 голосов
/ 28 февраля 2009

Моя среда разработки Rails основана на Windows, а моя производственная среда основана на Linux.

Возможно, будет использоваться VirtualHost. Предположим, что на одно имя файла необходимо сослаться в папке /public с помощью File.open('/tmp/abc.txt', 'r').

- но в Windows это должно быть C:\tmp\abc.txt. Как я могу сделать правильное объединение путей для обработки двух разных сред?

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

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

А когда prefix_tmp_path = "C:\tmp\", я получаю C:\tmp\/1.txt

Как правильно обрабатывать оба случая?

Ответы [ 2 ]

301 голосов
/ 28 февраля 2009

Я рекомендую использовать File.join

>> File.join("path", "to", "join")
=> "path/to/join"
44 голосов
/ 28 февраля 2009

На что стоит обратить внимание. Ruby использует «/» для разделения файлов на всех платформах, включая Windows, поэтому вам не нужно использовать разный код для объединения вещей на разных платформах. «C: /tmp/1.text» должен работать нормально.

File.join () - ваш друг для объединения путей.

prefix_tmp_path = 'C:/tmp'
filename = "#{rand(10)}.txt"
fullname = File.join(prefix_tmp_path, filename) # e.g., C:/tmp/3.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...