extension - ruby read file content




Lit le fichier binaire sous forme de chaîne dans Ruby (6)

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

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

Je pensais que ça suffirait à le convertir en chaîne, mais quand j'essayerais de l'é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 des contenus intacts). Y a-t-il une petite erreur que je commets ou une façon totalement différente (mais réalisable) d'y parvenir?


D'abord, vous devriez ouvrir le fichier en tant que fichier binaire. Ensuite, vous pouvez lire le fichier entier dans une commande.

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

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

Après cela, vous voulez probablement file.close . Si vous ne le faites pas, le file ne sera pas fermé tant qu'il n'aura pas été récupéré par les ordures, donc ce serait un léger gaspillage de ressources système tant qu'il est ouvert.


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 }

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 doux est:

s = IO.read(filename)

Si vous pouvez encoder le fichier tar par Base64 (et le stocker dans un fichier texte), 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 le cmd.


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

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

sur os x ce sont les mêmes pour moi ... cela pourrait-il être "" supplémentaire dans Windows?

en tout cas, vous pouvez être meilleur avec:

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




file-io