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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top