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

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

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

Re[2]: ZipPackageを使ってファイル圧縮されない


(過去ログ 90 を表示中)

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

■54040 / inTopicNo.1)  ZipPackageを使ってファイル圧縮されない
  
□投稿者/ ペンペン (3回)-(2010/10/03(Sun) 22:58:38)

分類:[VB.NET/VB2005 以降] 

VB2008のZipPackageというものを使用してzipファイルを作成しようとしているのですが、
pdfやWordファイルを圧縮しようとすると、圧縮サイズが元のサイズを超えてしまい、
元のファイルサイズよりも大きくなってしまいます。

Imports System.IO
Imports System.IO.Packaging

Public Class Test

Private Sub ZipTest()
    Dim strFile As String = "(パス)\test.pdf"

    Using zip As ZipPackage = ZipPackage.Open(strFile, FileMode.Create)
        Dim zpp As ZipPackagePart = zip.CreatePart(New Uri("/test.pdf", UriKind.Relative), _
                                                   System.Net.Mime.MediaTypeNames.Application.Octet, _
                                                   CompressionOption.Maximum)
        Using fs As New FileStream(strFile, FileMode.Open, FileAccess.Read)
            CopyStream(fs, zpp.GetStream())
        End Using
    End Using
End Sub

Private Sub CopyStream(ByVal srmSrc As Stream, ByVal srmDst As Stream)
    Const BUFFER_SIZE As Integer = &H1000

    Dim byt(BUFFER_SIZE) As Byte
    Dim intByteRead As Integer = 0

    Do
        intByteRead = srmSrc.Read(byt, 0, BUFFER_SIZE)
        If intByteRead > 0 Then
            srmDst.Write(byt, 0, intByteRead)
        Else
            Exit Do
        End If
    Loop
End Sub

End Class

また、zip.CreatePartの第2引数に、ファイルに対応するContentType(上記例でいうと"application/pdf")を設定しても、
圧縮サイズが元のサイズより大きくなってしまいます。
それと、テキストファイルは圧縮されますが、Wordのファイル(この時は.doc形式)のファイルは上記pdfの例と同様、
圧縮サイズが元のサイズより大きくなってしまいます。
なお、zip.CreatePartの第3引数をCompressionOption.NotCompressedにすると、元のファイルのサイズでzip化されます。
どうすればZipPackageを使用してファイルを圧縮できるでしょうか?
よろしくお願いします。

引用返信 編集キー/
■54042 / inTopicNo.2)  Re[1]: ZipPackageを使ってファイル圧縮されない
□投稿者/ Hongliang (727回)-(2010/10/03(Sun) 23:35:24)
そもそも、ZipPackage クラスは zip ファイルを作ることが主眼ではないのですが大丈夫でしょうか?
System.IO.Packaging は Open Packaging Conventions 仕様に基づくパッケージングのためのライブラリです。ファイルを作成したときは普通の Zip ファイルとしては余計なものが追加されますし、普通の Zip ファイルの中を見ることもできません。
普通に zip ファイルを扱いたい場合、#ziplib などのライブラリを使ったりしましょう。

さて、質問の本題ですが、どれくらい圧縮できるかは圧縮アルゴリズムによるところも大きいですが、それ以上に元データに依存します。
例えば、元データが jpeg や png と言った圧縮済み画像データを格納している場合、それを再圧縮したらもとより大きくなると言うのもよくある話です。特に deflate (zip ファイルの代表的圧縮アルゴリズム)はそう言うデータが苦手ですし。
テキストとかは圧縮しやすいデータなんですが。
引用返信 編集キー/
■54052 / inTopicNo.3)  Re[1]: ZipPackageを使ってファイル圧縮されない
□投稿者/ 魔界の仮面弁士 (1847回)-(2010/10/04(Mon) 11:24:18)
No54040 (ペンペン さん) に返信
> VB2008のZipPackageというものを使用してzipファイルを作成しようとしているのですが、
Zip ファイルを作りたいなら、別のライブラリを使った方が良いと思います。
https://connect.microsoft.com/VisualStudioJapan/feedback/details/380804/windows-zip-zip
http://dotnetzip.codeplex.com/
http://www.csdinc.co.jp/archiver/lib/unzip32.html
http://www.icsharpcode.net/opensource/sharpziplib/


> Using zip As ZipPackage = ZipPackage.Open(strFile, FileMode.Create)
> Using fs As New FileStream(strFile, FileMode.Open, FileAccess.Read)
ZipPackage で開いている最中のファイルを、FileStream でさらに開くのですか?


> VB2008のZipPackageというものを使用してzipファイルを作成しようとしているのですが、
> pdfやWordファイルを圧縮しようとすると、圧縮サイズが元のサイズを超えてしまい、
> 元のファイルサイズよりも大きくなってしまいます。
Hongliang さんの投稿に被る部分もありますが、System.IO.Packaging は OPC のためのものです。

提示のコードだと、ZipPackage の性質上、その ZIP ファイルの中には、
『[Content_Types].xml』といったファイルが付与される事になるでしょう。

また、既に圧縮されたファイルなどはほとんど圧縮されないか、またはむしろ肥大化することになります。
たとえば、
 http://www.kobu.com/docs/pdf/pdfxhand.htm#file_format
のような無圧縮PDFであれば、サイズは小さくなると思いますが、
殆どの PDF は既に何らかの圧縮が施されているはずです。
 http://www.kobu.com/docs/pdf/pdfxhand.htm#a_compress
引用返信 編集キー/
■54076 / inTopicNo.4)  Re[2]: ZipPackageを使ってファイル圧縮されない
□投稿者/ ペンペン (4回)-(2010/10/04(Mon) 19:11:44)
なるほど、.netで提供されているものでアーカイブを作成しようと思ったのですが、
そもそもZipPackageは圧縮の目的で作成されたのではないのですね。
とりあえず、圧縮できればもうけものという程度ですので、とりあえずは圧縮なしでアーカイブを作成することとし、
今後圧縮を考えるときは別のライブラリを使用することを検討します。

>>Using zip As ZipPackage = ZipPackage.Open(strFile, FileMode.Create)
>> Using fs As New FileStream(strFile, FileMode.Open, FileAccess.Read)
> ZipPackage で開いている最中のファイルを、FileStream でさらに開くのですか?

これは元ソースを編集したときの間違いでした。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -