Question

J'ai besoin d'un moyen simple de convertir un fichier tar 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 que la plupart du contenu est intact). Y a-t-il une petite erreur que je fais ou une façon totalement différente (mais réalisable) d'y parvenir?

Était-ce utile?

La solution

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 permettra d'obtenir l'intégralité du fichier dans une chaîne.

Après cela, vous souhaiterez probablement fichier.close . Si vous ne le faites pas, le fichier ne sera pas fermé tant qu'il n'aura pas été collecté. Il s'agirait donc d'un léger gaspillage de ressources système lorsqu'il est ouvert.

Autres conseils

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

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

Si ce n’est pas le cas, plus court et plus doux est:

s = IO.read(filename)

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 }

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

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

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

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

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

Ruby a une lecture binaire

data = IO.binread(path/filaname)

ou si inférieur à Ruby 1.9.2

data = IO.read(path/file)

Vous pouvez probablement encoder le fichier tar en Base64. La base 64 vous donnera une représentation ASCII pure du fichier que vous pouvez stocker dans un fichier texte brut. 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)

Consultez les Rubydocs pour obtenir de la Base64. une meilleure idée.

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}

ou

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

pour imprimer chaque ligne (texte) dans la cmd.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top