webentwicklung-frage-antwort-db.com.de

Liest die Binärdatei als String in Ruby

Ich brauche eine einfache Möglichkeit, um eine TAR-Datei in eine Zeichenfolge umzuwandeln (und umgekehrt). Gibt es eine Möglichkeit, dies in Ruby zu tun? Mein bester Versuch war dieser:

file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
  contents << line
}

Ich dachte, das würde ausreichen, um es in einen String umzuwandeln, aber dann, wenn ich versuche, es so zurückzuschreiben ...

newFile = File.open("test.tar.gz", "w")
newFile.write(contents)

Es ist nicht die gleiche Datei. Tun ls -l zeigt, dass die Dateien unterschiedlich groß sind, obwohl sie ziemlich nahe beieinander liegen (und das Öffnen der Datei zeigt, dass der größte Teil des Inhalts intakt ist). Gibt es einen kleinen Fehler, den ich mache, oder einen völlig anderen (aber praktikablen) Weg, um dies zu erreichen?

261
Chris Bunch

Zunächst sollten Sie die Datei als Binärdatei öffnen. Dann können Sie die gesamte Datei mit einem Befehl einlesen.

file = File.open("path-to-file.tar.gz", "rb")
contents = file.read

Dadurch erhalten Sie die gesamte Datei in einer Zeichenfolge.

Danach möchten Sie wahrscheinlich file.close. Wenn Sie dies nicht tun, wird file erst geschlossen, wenn es durch Müll gesammelt wird. Dies würde zu einer leichten Verschwendung von Systemressourcen führen, solange es geöffnet ist.

396
David Nehme

Wenn Sie den Binärmodus benötigen, müssen Sie dies auf die harte Tour tun:

s = File.open(filename, 'rb') { |f| f.read }

Wenn nicht, ist kürzer und süßer:

s = IO.read(filename)
241
Curt Sampson

Um zu vermeiden, dass die Datei geöffnet bleibt, übergeben Sie am besten einen Block an File.open. Auf diese Weise wird die Datei geschlossen, nachdem der Block ausgeführt wurde.

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
113
Aaron Hinni

wie wäre es mit etwas Sicherheit beim Öffnen/Schließen?.

string = File.open('file.txt', 'rb') { |file| file.read }
17
Alex

unter os x sind das für mich die gleichen ... könnte das in windows vielleicht extra "\ r" sein?

in jedem Fall können Sie besser mit:

contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)
17
Purfideas

Ruby haben binäre Lesung

data = IO.binread(path/filaname)

oder wenn weniger als Ruby 1.9.2

data = IO.read(path/file)
9
bardzo

Sie können die tar-Datei wahrscheinlich in Base64 codieren. Base 64 gibt Ihnen eine reine ASCII Darstellung der Datei, die Sie in einer Nur-Text-Datei speichern können. Anschließend können Sie die TAR-Datei abrufen, indem Sie den Text zurückdecodieren.

Du machst so etwas wie:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

Schauen Sie sich die Base64 Rubydocs an, um eine bessere Vorstellung zu bekommen.

6
comctrl6

Wenn Sie die tar-Datei mit Base64 kodieren können (und sie in einer einfachen Textdatei speichern können), können Sie sie verwenden

File.open("my_tar.txt").each {|line| puts line}

oder

File.new("name_file.txt", "r").each {|line| puts line}

um jede (text-) zeile im cmd zu drucken.

0
Boris