Tarファイルを取得して文字列に変換する(およびその逆)簡単な方法が必要です。 Rubyでこれを行う方法はありますか?私の最善の試みはこれでした:
file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
contents << line
}
私はそれを文字列に変換するのに十分だと思っていましたが、その後、このように書き戻そうとすると...
newFile = File.open("test.tar.gz", "w")
newFile.write(contents)
同じファイルではありません。 ls -l
を実行すると、ファイルのサイズが異なることが示されますが、それらはかなり近いものです(ファイルを開くと、ほとんどの内容がそのまま表示されます)。私が犯している小さな間違い、またはこれを達成するためのまったく異なる(しかし実行可能な)方法はありますか?
まず、ファイルをバイナリファイルとして開く必要があります。その後、1つのコマンドでファイル全体を読み取ることができます。
file = File.open("path-to-file.tar.gz", "rb")
contents = file.read
これにより、ファイル全体を文字列で取得できます。
その後、おそらく_file.close
が必要になります。そうしないと、file
はガベージコレクションされるまで閉じられないため、開いている間はシステムリソースが少し無駄になります。
バイナリモードが必要な場合は、難しい方法で行う必要があります。
s = File.open(filename, 'rb') { |f| f.read }
そうでない場合、短くて甘い:
s = IO.read(filename)
ファイルを開いたままにしないようにするには、File.openにブロックを渡すことをお勧めします。これにより、ブロックの実行後にファイルが閉じられます。
contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
oS Xでは、これらは私にとって同じです...これはWindowsの余分な「\ r」かもしれませんか?
いずれにせよ、あなたは次の方が良いかもしれません:
contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)
開閉の安全性はどうですか。
string = File.open('file.txt', 'rb') { |file| file.read }
Rubyにはバイナリ読み取り機能があります
data = IO.binread(path/filaname)
またはRuby 1.9.2未満の場合
data = IO.read(path/file)
おそらくBase64でtarファイルをエンコードできます。 Base 64は、プレーンテキストファイルに保存できるファイルの純粋なASCII表現を提供します。その後、テキストをデコードしてtarファイルを取得できます。
あなたは次のようなことをします:
require 'base64'
file_contents = Base64.encode64(tar_file_data)
より良いアイデアを得るには、Base64 Rubydocs をご覧ください。
Base64でtarファイルをエンコード(およびプレーンテキストファイルに保存)できる場合は、次を使用できます。
File.open("my_tar.txt").each {|line| puts line}
または
File.new("name_file.txt", "r").each {|line| puts line}
cmdの各(テキスト)行を印刷します。