267

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

4

9 に答える 9

399

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

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

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

その後、おそらくしたいでしょうfile.close。そうしないと、fileガベージコレクションされるまで閉じられないため、開いている間はシステムリソースがわずかに浪費されます。

于 2008-09-25T01:30:56.863 に答える
247

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

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

そうでない場合、より短くて甘いのは次のとおりです。

s = IO.read(filename)
于 2008-11-07T05:24:54.170 に答える
114

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

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
于 2008-09-25T02:02:43.277 に答える
17

開閉の安全性についてはどうですか。

string = File.open('file.txt', 'rb') { |file| file.read }
于 2010-12-30T18:21:26.020 に答える
16

OS Xでは、これらは私にとって同じです...これはおそらくWindowsの余分な「\ r」でしょうか?

いずれにせよ、あなたはより良いかもしれません:

contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)
于 2008-09-25T01:27:34.530 に答える
6

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

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

require 'base64'

file_contents = Base64.encode64(tar_file_data)

より良いアイデアを得るには、Base64 Rubydocsを参照してください。

于 2008-09-25T01:27:05.140 に答える
-1

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

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

また

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

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

于 2014-11-24T11:31:26.653 に答える