Rubyでバイナリファイルを文字列として読み取る
質問
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 の余分な " " でしょうか?
いずれの場合でも、次のようにしたほうがよいでしょう。
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)
おそらく、tar ファイルを Base64 でエンコードできるでしょう。Base 64 では、プレーン テキスト ファイルに保存できるファイルの純粋な ASCII 表現が得られます。その後、テキストをデコードして tar ファイルを取得できます。
次のようなことを行います。
require 'base64'
file_contents = Base64.encode64(tar_file_data)
Base64を見てみましょう Rubydocs より良いアイデアを得るために。
tar ファイルを Base64 でエンコードできる (そしてそれをプレーン テキスト ファイルに保存できる) 場合は、次のように使用できます。
File.open("my_tar.txt").each {|line| puts line}
または
File.new("name_file.txt", "r").each {|line| puts line}
cmd の各 (テキスト) 行を出力します。