C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

圧縮・解凍をメモリ上で行う方法 [1]

[トピック内 28 記事 (21 - 28 表示)]  << 0 | 1 >>

■94616 / inTopicNo.21)  Re[19]: 圧縮・解凍をメモリ上で行う方法
  
□投稿者/ Hongliang (1015回)-(2020/04/24(Fri) 19:23:06)
> ファイルに書き込んである
> 圧縮データのサイズをどのようにして使えばいいですか?
圧縮データの読み込み自体は、DeflateStreamにせよGZipStreamにせよ末尾を認識してくれるので、単純に読み取ればいいだけです。
DeflateStreamやGZipStreamで読み取った後のStreamのPositionは、必ずしも圧縮データ部の末尾になると限りません。
なので、そこに自前でシークする必要があります。
圧縮データの先頭Positionと、圧縮データの長さがあれば、圧縮されたデータの末尾の位置を計算できるので、そこにシークさせることで圧縮データのあとのデータを読み取れます。
引用返信 編集キー/
■94618 / inTopicNo.22)  Re[20]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ gegege (17回)-(2020/04/24(Fri) 21:39:20)
そういうことでしたか

どうもありがとうございます

解決済み
引用返信 編集キー/
■94619 / inTopicNo.23)  Re[21]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ gegege (18回)-(2020/04/24(Fri) 23:05:36)
すいません、ZipArchiveの方で
SeekあるいはPosition変更したいのですが、
この操作はサポートされていません
というエラーが出ます。
コードは以下の通りです、

ポジションを変えたい場合どうすれば良いですか?



Dim archive As ZipArchive = ZipFile.OpenRead(FileInPath)

For Each entry As ZipArchiveEntry In archive.Entries

stream = entry.Open
stream.position = 10
stream.Seek(10, SeekOrigin.Begin)


Exit For

Next entry


引用返信 編集キー/
■94620 / inTopicNo.24)  Re[22]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ Azulean (1142回)-(2020/04/25(Sat) 08:55:48)
No94619 (gegege さん) に返信
> SeekあるいはPosition変更したいのですが、
> この操作はサポートされていません
> というエラーが出ます。
(略)
> ポジションを変えたい場合どうすれば良いですか?

エラーがあるとおり、「できない」わけです。

多くの圧縮アルゴリズムは途中からの展開・伸張が難しいです。
このため、先頭から順番に読み出す操作以外を認めていません。

順次読み出して先頭 10 バイトだけ無視したいなら、stream.Read で 10 バイト分読んで無視すれば良いでしょう。
自由にシークしたいなら、FileStream か MemoryStream にコピーして(書き写して)からその新しい Stream で処理してください。
引用返信 編集キー/
■94622 / inTopicNo.25)  Re[23]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ gegege (19回)-(2020/04/25(Sat) 10:54:45)
ありがとうございます。

stream = New MemoryStream
entry.Open.CopyTo(stream)

これでうまくいきました。
ただ、なぜか

stream.Position = 0

とpositionをリセットしないと駄目でした。
コピー直後ってシークの位置が最初に戻るものなのですか?

引用返信 編集キー/
■94623 / inTopicNo.26)  Re[24]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ Azulean (1143回)-(2020/04/25(Sat) 12:32:24)
No94622 (gegege さん) に返信
> ただ、なぜか
> stream.Position = 0
> とpositionをリセットしないと駄目でした。
> コピー直後ってシークの位置が最初に戻るものなのですか?

逆でしょう。
コピーで書き込んだわけだから、コピー先(stream)の現在位置が最後(末尾)になっているので、先頭に戻す(Position = 0)ことになったのでは?
引用返信 編集キー/
■94624 / inTopicNo.27)  Re[25]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ gegege (20回)-(2020/04/25(Sat) 13:12:15)
それもそうですね
どうもありがとうございます。

解決済み
引用返信 編集キー/
■94626 / inTopicNo.28)  Re[26]: 圧縮・解凍をメモリ上で行う方法
□投稿者/ gegege (21回)-(2020/04/25(Sat) 22:11:51)
何度もすいません。

ZipArchiveを使っているのですが、
バイナリデータを書き込みしながら、Zip圧縮を行うよりも、
一度MemoryStreamにバイナリデータを保存してから
そのMemoryStreamを使ってZip圧縮を行った方が5倍くらい処理時間が短くなるのですが
これってこういうものですか?
ファイルサイズはほぼ同じになります。

引用返信 編集キー/

このトピックをツリーで一括表示

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ