Frage

Ich brauche eine einfache Möglichkeit, eine TAR-Datei zu nehmen und es in einen String (und umgekehrt) zu umwandeln. Gibt es eine Möglichkeit, dies in Ruby zu tun? Mein bester Versuch war:

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

dachte ich, dass genug wäre, es in eine Zeichenfolge zu konvertieren, aber dann, wenn ich versuche es so wieder heraus zu schreiben ...

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

Es ist nicht die gleiche Datei. ls -l Doing zeigt die Dateien unterschiedlicher Größe sind, obwohl sie ziemlich nahe sind (und Öffnen der Datei zeigt die meisten Inhalte intakt). Gibt es einen kleinen Fehler ich mache oder ein ganz anderer (aber bearbeitbar) Weg dies zu tun?

War es hilfreich?

Lösung

Als erstes sollten Sie die Datei als Binärdatei öffnen. Dann können Sie die gesamte Datei in, in einem Befehl lesen.

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

Das wird Ihnen die gesamte Datei in einem String erhalten.

Danach, möchten Sie wahrscheinlich file.close. Wenn Sie das nicht tun, wird file nicht geschlossen werden, bis es Garbage Collection ist, so wäre es ein leichter Abfall der Systemressourcen, während es geöffnet ist.

Andere Tipps

Wenn Sie Binär-Modus benötigen, müssen Sie es auf die harte Art und Weise tun:

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

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

s = IO.read(filename)

Um zu vermeiden, um die Datei öffnen zu verlassen, ist es am besten, einen Block zu File.open passieren. Auf diese Weise wird die Datei nach dem Block ausgeführt geschlossen werden.

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

auf OS X diese sind für mich ... könnte dies vielleicht zusätzlich sein "\ r" in Windows?

in jedem Fall können Sie besser sein, mit:

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

Wie wäre es mit open / close Sicherheit.

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

Ruby-Binär-Lese hat

data = IO.binread(path/filaname)

oder, wenn weniger als Ruby-1.9.2

data = IO.read(path/file)

Sie können sich wahrscheinlich die TAR-Datei in Base64 kodieren. 64 Base wird Ihnen eine reine ASCII-Darstellung der Datei, die Sie in einer Textdatei speichern. Dann können Sie die TAR-Datei abrufen, indem Decodierung des Textes zurück.

Sie tun so etwas wie:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

Haben Blick auf die Base64 Rubydocs zu erhalten eine bessere Idee.

Wenn Sie die TAR-Datei von Base64 kodieren kann (und es in einer Textdatei speichern) Sie verwenden können,

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

oder

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

each (Text) Zeile im cmd drucken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top