none
Packageクラスを使用した圧縮ファイルの作成について RRS feed

  • 質問

  • こんばんは。

     

    現在、WPFでPackageクラスを使用してフォルダを圧縮するプログラムを書いております。

    test.zipを作成しその中にxmlファイルとビットマップファイルを入れて圧縮させようとしています。

     

    以下にコードを書いてZipの圧縮ファイルを作成出来たのですがサイズを見ると圧縮前と全く同じ

    でフォルダが圧縮されていない状態になってしまっています。

     

    いろいろと試行錯誤したのですが原因が分からないためアドバイスお願いします。

     

     

    using System;
    using System.IO;
    using System.IO.Packaging;
    using System.Windows;

    namespace test
    {
        class ZIPWrite
        {
           
            private static string packagePath  = @"D:\test.zip";
           
            private static string documentPath = @"test1\test.xml";
           
            private static string resourcePath = @"test2\test.bmp";

            public static void Main()
            {
               
                CreateZip();

            }
            private static void CreateZip()
            {
               
                Uri partUriDocument = PackUriHelper.CreatePartUri(
                                          new Uri(documentPath, UriKind.Relative));
                Uri partUriResource = PackUriHelper.CreatePartUri(
                                          new Uri(resourcePath, UriKind.Relative));
                using (Package package =
                    Package.Open(packagePath, FileMode.Create))
                {
                   
                    PackagePart packagePartDocument =
                        package.CreatePart(partUriDocument,
                                       System.Net.Mime.MediaTypeNames.Text.Xml,CompressionOption.Normal);

                    using (FileStream fileStream = new FileStream(
                           documentPath, FileMode.Open, FileAccess.Read))
                    {
                        CopyStream(fileStream, packagePartDocument.GetStream());
                    }
                   
                    package.CreateRelationship(packagePartDocument.Uri,
                                               TargetMode.Internal);
                   
                    PackagePart packagePartResource =
                        package.CreatePart(partUriResource,
                                       System.Net.Mime.MediaTypeNames.Image.Jpeg,CompressionOption.Normal);

                    using (FileStream fileStream = new FileStream(
                           resourcePath, FileMode.Open, FileAccess.Read))
                    {
                        CopyStream(fileStream, packagePartResource.GetStream());
                    }
                   
                    packagePartDocument.CreateRelationship(
                                            new Uri(@"test2\test.bmp",
                                            UriKind.Relative),
                                            TargetMode.Internal);
                   
                }

            }

           

        private static void CopyStream(Stream source, Stream target)
            {
                const int bufSize = 0x1000;
                byte[] buf = new byte[bufSize];
                int bytesRead = 0;
                while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
                    target.Write(buf, 0, bytesRead);
            }

        }

    }

    2008年11月10日 12:38

回答

すべての返信

  • Package.CreatePart()関数の引数で圧縮オプションが選択できるようですよ。

    CompressionOption.Maximumを使うと圧縮されています。

    MSDNの記述とちょっと整合しないように思われますが...

     

    http://msdn.microsoft.com/ja-jp/library/system.io.packaging.package.createpart(VS.85).aspx
    2008年11月11日 10:59
  • 石動様

    さっそくのアドバイスありがとうございます。

     

    CompressionOptionは5種類くらいの圧縮モードがありますが全て試してみたのですがダメでした・・・。

    そもそもPackageクラスはビットマップの圧縮はサポートしていないのでしょうか?

     

    System.Net.Mime.MediaTypeNamesのメソッドにJpegやTiffはあるのですがBitmapがないのも気にな

    ります。

     

    Jpegやテキストは元々のコードで圧縮されていることが確認できました。ただ圧縮といっても全体のファイ

    ルサイズは小さくなりましたがただ個々のファイルの圧縮率が0%になっているのも気になります。

    2008年11月11日 15:36
  • こんにちは。中川俊輔 です。

     

    石動さん、回答ありがとうございます。

     

    入門者さん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、石動さんの回答へ回答済みチェックをつけさせていただきました。

     

    私も調べてみたところ、コネクトにフィードバックが投稿されているのを見つけました。

    同じ不具合が発生している可能性があるかもしれません。

    GZipStream/DeflateStream increase file size on compression
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93636

    System.IO.Packaging.CompressionOption.* has no affect?
    http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=304300

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

     

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。

    コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年11月25日 8:51