windows - Ruby tempfile korruption af binære filer

Indlæg af Hanne Mølgaard Plasc

Problem



Efter mange graveringer har jeg fundet ud af, at RubyZip kan ødelægge binære filer. Efter at have kigget nærmere, ser det ud til Tempfile klassen kan ikke åbne binære filer korrekt. For at demonstrere effekten skal du tage følgende script:


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


Den test.bin fil, jeg bruger, indeholder kun to byte: 00 1a. Efter korruption af den midlertidige fil indeholder den 1 byte: 00. Hvis det betyder noget, kører jeg vinduer.


Er der noget, jeg mangler? Er denne forsætlige adfærd? Og i så fald er der en måde at forhindre denne adfærd på?


tak skal du have

Bedste reference


Metoden open er dokumenteret som: [9]



  Åbner eller genåbner filen med tilstand r+.



Det betyder, at du ikke kan stole på den metode til at åbne den i den rigtige tilstand. Det er ikke så meget, da den normale brug af Tempfile er anderledes:


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


Nu er det blevet 'rewound', kan du læse alle de data, du vil have fra det, fra begyndelsen.