質問

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 の各 (テキスト) 行を出力します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top