web-dev-qa-db-ja.com

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を実行すると、ファイルのサイズが異なることが示されますが、それらはかなり近いものです(ファイルを開くと、ほとんどの内容がそのまま表示されます)。私が犯している小さな間違い、またはこれを達成するためのまったく異なる(しかし実行可能な)方法はありますか?

260
Chris Bunch

まず、ファイルをバイナリファイルとして開く必要があります。その後、1つのコマンドでファイル全体を読み取ることができます。

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

これにより、ファイル全体を文字列で取得できます。

その後、おそらく_file.closeが必要になります。そうしないと、fileはガベージコレクションされるまで閉じられないため、開いている間はシステムリソースが少し無駄になります。

394
David Nehme

バイナリモードが必要な場合は、難しい方法で行う必要があります。

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

そうでない場合、短くて甘い:

s = IO.read(filename)
240
Curt Sampson

ファイルを開いたままにしないようにするには、File.openにブロックを渡すことをお勧めします。これにより、ブロックの実行後にファイルが閉じられます。

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
113
Aaron Hinni

oS Xでは、これらは私にとって同じです...これはWindowsの余分な「\ r」かもしれませんか?

いずれにせよ、あなたは次の方が良いかもしれません:

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

開閉の安全性はどうですか。

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

Rubyにはバイナリ読み取り機能があります

data = IO.binread(path/filaname)

またはRuby 1.9.2未満の場合

data = IO.read(path/file)
8
bardzo

おそらくBase64でtarファイルをエンコードできます。 Base 64は、プレーンテキストファイルに保存できるファイルの純粋なASCII表現を提供します。その後、テキストをデコードしてtarファイルを取得できます。

あなたは次のようなことをします:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

より良いアイデアを得るには、Base64 Rubydocs をご覧ください。

5
comctrl6

Base64でtarファイルをエンコード(およびプレーンテキストファイルに保存)できる場合は、次を使用できます。

File.open("my_tar.txt").each {|line| puts line}

または

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

cmdの各(テキスト)行を印刷します。

0
Boris