結論
write
じゃなくてwrite_all
を使え
rustのzipfileでファイルが欠損する
let mut buf = Vec::new();
let _ = file.read_to_end(&mut buf);
let _ = zip.start_file(file.name(), options);
let _ = zip.write(&buf).unwrap();
こんな感じのコードでJpegをZip圧縮していたら,Jpegファイルが欠損している.画像処理でまずったかと思ったら,zipfileの書き込みがおかしかった.
原因
そもそもwrite
はすべて書き込むことが保証されていないとリファレンスに書かれている.後からよく考えたら戻り値が書き込まれたバイト数となっている時点でおかしいと気づくべきだった.
write_all
はOkなら書き込みが完了していることが保証されている.