Erstellung einer thread-sicheren temporären Dateinamen
Bei der Verwendung Tempfile
Ruby, ist das erstellen einer Datei mit einer thread-safe und inter-Prozess-sicheren Namen. Ich brauche nur einen Datei-Namen in dieser Weise.
Ich Frage mich, ob es einen eher geradlinigen Ansatz Weise als:
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dir::Tmpname.erstellen
Könnten Sie
Dir::Tmpname.create
. Es findet heraus, was das temporäre Verzeichnis zu verwenden (es sei denn, Sie übergeben es ein Verzeichnis). Es ist ein wenig hässlich zu verwenden gegeben, dass es erwartet einen block:Den block gibt es für den code zu testen, ob die Datei existiert und das auslösen einer
Errno::EEXIST
so, dass ein neuer name generiert werden kann, mit ansteigender Wert angehängt am Ende.Die Schienen-Lösung
Die Lösung implementiert Ruby on Rails ist kurz und ähnlich der Lösung, die ursprünglich umgesetzt in Ruby:
Dir::Tmpname.make_tmpname (Ruby 2.5.0 und früher)
Graben in
tempfile.rb
werden Sie feststellen, dassTempfile
umfasstDir::Tmpname
. Im inneren finden Siemake_tmpname
die tut, was Sie verlangen.Dir::Tmpname.make_tmpname(['a', '.png'], nil)
require 'tmpdir'
für diese zu arbeiten.Dir::Tmpname.make_tmpname
war entfernt in Ruby 2.5Seit
Dir::Tmpname.make_tmpname
war entfernt in Ruby 2.5.0, dieses fällt wieder auf die VerwendungSecureRandom
:Da brauchen Sie nur den Dateinamen, was über die Verwendung der SecureRandom für die:
Können Sie auch
SecureRandom.alphanumeric
Fand ich die Dir:Tmpname-Lösung funktionierte nicht für mich. Bei der Beurteilung dieser:
Unter MRI Ruby 1.9.3p194 ich bekommen:
Unter JRuby 1.7.5 (1.9.3p393) bekomme ich:
Könnten Sie versuchen, so etwas wie dieses: