Wie mache ich einen sicheren Join-Pfadnamen in Ruby?

188

Meine Rails-Entwicklungsumgebung basiert auf Windows und meine Produktionsumgebung basiert auf Linux.

Möglicherweise wird VirtualHost verwendet. Angenommen, ein Dateiname muss im /publicOrdner mit referenziert werden File.open('/tmp/abc.txt', 'r').

- aber in Windows sollte es sein C:\tmp\abc.txt. Wie kann ich eine korrekte Pfadverknüpfung durchführen, um die zwei verschiedenen Umgebungen zu handhaben?

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

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

Und wenn prefix_tmp_path = "C:\tmp\"ich bekommeC:\tmp\/1.txt

Was ist der richtige Weg, um beide Fälle zu behandeln?

Jirapong
quelle

Antworten:

329

Ich empfehle die Verwendung von File.join

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

Eine Sache zu beachten. Ruby verwendet auf allen Plattformen, einschließlich Windows, ein "/" für das Dateitrennzeichen, sodass Sie keinen unterschiedlichen Code verwenden müssen, um Dinge auf verschiedenen Plattformen zusammenzufügen. "C: /tmp/1.text" sollte gut funktionieren.

File.join () ist dein Freund, um Pfade miteinander zu verbinden.

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
quelle