Pregunta

Necesito una manera fácil de tomar un archivo tar y convertirlo en una cadena (y viceversa). ¿Hay alguna manera de hacer esto en Ruby? Mi mejor intento fue este:

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

Pensé que sería suficiente para convertirlo en una cadena, pero cuando trato de escribirlo de nuevo de esta manera ...

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

No es el mismo archivo. Hacer ls -l muestra que los archivos son de diferentes tamaños, aunque están bastante cerca (y abrir el archivo revela la mayor parte del contenido intacto). ¿Hay un pequeño error que estoy cometiendo o una forma completamente diferente (pero viable) de lograr esto?

¿Fue útil?

Solución

Primero, debe abrir el archivo como un archivo binario. Luego puede leer el archivo completo en un solo comando.

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

Eso te dará todo el archivo en una cadena.

Después de eso, probablemente quieras file.close . Si no lo hace, el archivo no se cerrará hasta que se recolecte basura, por lo que sería un pequeño desperdicio de recursos del sistema mientras está abierto.

Otros consejos

Si necesita el modo binario, deberá hacerlo de la manera difícil:

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

Si no, más corto y más dulce es:

s = IO.read(filename)

Para evitar dejar el archivo abierto, es mejor pasar un bloque a File.open. De esta manera, el archivo se cerrará después de que se ejecute el bloque.

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

en os x estos son los mismos para mí ... ¿podría ser esto extra '' \ r ''? en windows?

en cualquier caso puede ser mejor con:

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

¿qué tal algo de seguridad de apertura / cierre?

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

Ruby tiene lectura binaria

data = IO.binread(path/filaname)

o si es menor que Ruby 1.9.2

data = IO.read(path/file)

Probablemente pueda codificar el archivo tar en Base64. Base 64 le dará una representación ASCII pura del archivo que puede almacenar en un archivo de texto sin formato. Luego puede recuperar el archivo tar decodificando el texto nuevamente.

Haces algo como:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

Eche un vistazo a Base64 Rubydocs para obtener una mejor idea.

Si puede codificar el archivo tar con Base64 (y almacenarlo en un archivo de texto sin formato) puede usar

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

o

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

para imprimir cada línea (texto) en el cmd.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top