2017-07-11 49 views
0

RubyZipがバイナリファイルを破損する可能性があることが判明しました。よく見ると、Tempfileクラスはバイナリファイルを正しく再オープンできないようです。Rubyのバイナリファイルの一時ファイルの破損

require 'tempfile' 

tmp = Tempfile.new('test.bin', Dir.getwd) 
File.open('test.bin', 'rb') { |h| IO.copy_stream(h, tmp) } # => 2 
# 2 is the expected number of bytes 
tmp.close 
# temporary file (looking in OS) now really IS 2 bytes in size 
tmp.open 
# temporary file (looking in OS) now is 1 byte in size 
tmp.binmode 
# temporary file (looking in OS) still has the wrong number of bytes (1) 
tmp.read.length # => 1 
# And here is the problem I keep bumping into 

私が使用しているtest.binファイルは2バイトのみ含まれています:00 1aを効果を発揮するには、次のスクリプトを取ります。テンポラリファイルの破損後、1バイト:00が含まれています。それが重要なら私は窓を走らせている。

紛失しているものがありますか?これは意図的な行動ですか?もしそうなら、この振る舞いを防ぐ手段がありますか?

答えて

2

インスタンスopen methodをありがとうございとして文書化されています

モードr+でファイルを開くか、再オープンします。

これは、その方法を使用して正しいモードで開くことができないことを意味します。一時ファイルの通常の使用が異なるため、それは大したことではないのです。

tmp = Tempfile.new('test.bin', Dir.getwd) 
File.open('test.bin', 'rb') { |h| IO.copy_stream(h, tmp) } # => 2 
tmp.rewind 

を今では「巻き戻し」されていたら、あなたはそれが最初から始まるから必要なすべてのデータを読み取ることができます。

関連する問題