J'ai besoin d'un moyen facile de prendre un fichier tar et de le convertir en chaîne (et vice versa). Existe-t-il un moyen de le faire en Ruby? Ma meilleure tentative était la suivante:
file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
contents << line
}
J'ai pensé que ce serait suffisant pour le convertir en chaîne, mais quand j'essaie de le réécrire comme ça ...
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 entièrement différente (mais réalisable) d'accomplir cela?
IO.read
serait la réponse préférée sinon.Réponses:
Tout d'abord, vous devez ouvrir le fichier en tant que fichier binaire. Vous pouvez ensuite lire l'intégralité du fichier dans une seule commande.
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
il ne sera pas fermé jusqu'à ce qu'il soit récupéré, ce serait donc un léger gaspillage de ressources système pendant qu'il est ouvert.la source
contents = (contents of file "path to file.txt" as string)
.begin {..open..} ensure {..close..} end
blocscontents = File.binread('path-to-file.tar.gz')
Voir apidock .File
est une sous-classe deIO
.Si vous avez besoin du mode binaire, vous devrez le faire à la dure:
Sinon, plus court et plus doux est:
la source
s = File.open(filename, 'rb', &:read)
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.
la source
sous os x, ce sont les mêmes pour moi ... cela pourrait-il être "\ r" supplémentaire dans Windows?
en tout cas vous pouvez être mieux avec:
la source
que diriez-vous d'une certaine sécurité d'ouverture / fermeture.
la source
Ruby a une lecture binaire
ou si moins que Ruby 1.9.2
la source
Vous pouvez probablement encoder le fichier tar en Base64. 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:
Jetez un œil aux Rubydocs Base64 pour avoir une meilleure idée.
la source
Si vous pouvez encoder le fichier tar en Base64 (et le stocker dans un fichier texte brut), vous pouvez utiliser
ou
pour imprimer chaque ligne (texte) dans le cmd.
la source