Leggi il file binario come stringa in Ruby
Domanda
Ho bisogno di un modo semplice per prendere un file tar e convertirlo in una stringa (e viceversa). C'è un modo per farlo in Ruby? Il mio miglior tentativo è stato questo:
file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
contents << line
}
Ho pensato che sarebbe bastato convertirlo in una stringa, ma poi quando provo a riscriverlo in questo modo ...
newFile = File.open("test.tar.gz", "w")
newFile.write(contents)
Non è lo stesso file. Fare ls -l
mostra che i file sono di dimensioni diverse, anche se sono piuttosto vicini (e l'apertura del file rivela la maggior parte dei contenuti intatti). C'è un piccolo errore che sto facendo o un modo completamente diverso (ma praticabile) per farlo?
Soluzione
Innanzitutto, dovresti aprire il file come file binario. Quindi puoi leggere l'intero file in, con un solo comando.
file = File.open("path-to-file.tar.gz", "rb")
contents = file.read
Questo ti porterà l'intero file in una stringa.
Successivamente, probabilmente vorrai file.close
. Se non lo fai, file
non verrà chiuso fino a quando non sarà raccolto in modo inutile, quindi sarebbe un leggero spreco di risorse di sistema mentre è aperto.
Altri suggerimenti
Se hai bisogno della modalità binaria, dovrai farlo nel modo più difficile:
s = File.open(filename, 'rb') { |f| f.read }
In caso contrario, più breve e più dolce è:
s = IO.read(filename)
Per evitare di lasciare il file aperto, è meglio passare un blocco a File.open. In questo modo, il file verrà chiuso dopo l'esecuzione del blocco.
contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
su os x questi sono gli stessi per me ... questo potrebbe forse essere extra " \ r " in windows?
in ogni caso potresti essere migliore con:
contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)
che ne dici di un po 'di sicurezza in apertura / chiusura.
string = File.open('file.txt', 'rb') { |file| file.read }
Ruby ha una lettura binaria
data = IO.binread(path/filaname)
o se inferiore a Ruby 1.9.2
data = IO.read(path/file)
Probabilmente puoi codificare il file tar in Base64. Base 64 fornisce una rappresentazione ASCII pura del file che è possibile memorizzare in un file di testo semplice. Quindi è possibile recuperare il file tar decodificando nuovamente il testo.
Fai qualcosa del tipo:
require 'base64'
file_contents = Base64.encode64(tar_file_data)
Dai un'occhiata a Base64 Rubydocs per ottenere un'idea migliore.
Se puoi codificare il file tar da Base64 (e memorizzarlo in un file di testo semplice) puoi usare
File.open("my_tar.txt").each {|line| puts line}
o
File.new("name_file.txt", "r").each {|line| puts line}
per stampare ogni riga (di testo) nel cmd.