web-dev-qa-db-fra.com

Lire le fichier binaire sous forme de chaîne dans Ruby

J'ai besoin d'un moyen facile de prendre un fichier tar et de le convertir en chaîne (et vice versa). Y a-t-il un moyen de faire cela en Ruby? Ma meilleure tentative a été la suivante:

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

Je pensais que cela suffirait pour le convertir en chaîne, mais lorsque j'essaie de l'écrire comme ceci ...

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

Ce n'est pas le même fichier. Faire ls -l montre que les fichiers sont de tailles différentes bien qu’ils soient assez proches (et l’ouverture du fichier révèle la plupart du contenu intact). Y a-t-il une petite erreur que je fais ou une manière totalement différente (mais réalisable) de réaliser cela?

261
Chris Bunch

Tout d'abord, vous devez ouvrir le fichier en tant que fichier binaire. Ensuite, vous pouvez lire le fichier entier, en une seule commande.

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

Cela vous donnera le fichier entier dans une chaîne.

Après cela, vous voudrez probablement file.close. Si vous ne le faites pas, file ne sera pas fermé tant que le ramassage des ordures n’aura pas été effectué. Ce serait donc un léger gaspillage de ressources système tant qu’il serait ouvert.

396
David Nehme

Si vous avez besoin du mode binaire, vous devrez le faire à la dure:

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

Sinon, plus court et plus sucré est:

s = IO.read(filename)
241
Curt Sampson

Pour éviter de laisser le fichier ouvert, il est préférable de passer un bloc à File.open. De cette façon, le fichier sera fermé après l'exécution du bloc.

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

que diriez-vous de la sécurité ouverte/étroite.

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

sur os x ce sont les mêmes pour moi ... cela pourrait-il être extra "\ r" dans Windows?

dans tous les cas, vous serez peut-être mieux avec:

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

Ruby a une lecture binaire

data = IO.binread(path/filaname)

ou si moins que Ruby 1.9.2

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

Vous pouvez probablement encoder le fichier tar en Base64. La base 64 vous donnera une pure représentation ASCII du fichier que vous pouvez stocker dans un fichier texte. Ensuite, vous pouvez récupérer le fichier tar en décodant le texte.

Vous faites quelque chose comme:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

Jetez un œil à Base64 Rubydocs pour avoir une meilleure idée.

6
comctrl6

Si vous pouvez encoder le fichier tar en Base64 (et le stocker dans un fichier texte brut), vous pouvez utiliser

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

o

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

pour imprimer chaque ligne (texte) dans la cmd.

0
Boris