最近のトラックバック

2017年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Google AdSense2

« 2009年2月 | トップページ | 2009年5月 »

2009年3月

サービスアプリ追加(ファイルをLZH圧縮)

Oncemail LabファイルをLZH圧縮を追加。


■サービス公開先
Oncemail Lab


■2009/03/25時点での公開サービス

サービス名概要
OfficeファイルをPDFファイル変換 Excel・Word・PowerPointファイルをPDFファイルに変換します。
Officeファイルバージョン変換 Excel・Word・PowerPointファイルのファイルバージョンを変換します。
PDFファイルにパスワード設定 PDFファイルにパスワードを設定します。
PDFをファイル結合 2つのPDFファイルを1つのPDFファイルに結合します。
ファイルをZIP圧縮 ファイルをZIP圧縮します。
ファイルをLZH圧縮 ファイルをLZH圧縮します。

C#でLZHの圧縮・解凍

C#でLZHの圧縮・解凍を行うサンプルを紹介する。
本サンプルではUNLHA32.DLLというフリーライブラリー(C言語DLL)を利用。


■DLLの準備方法
UNLHA32.DLLは統合アーカイバプロジェクトからダウンロードできる。

DLL 説明
UNLHA32.DLL LZH圧縮・解凍用ライブラリ。
UNLHA32.DLLファイルをC:\WindowsやC:\Windows\System32等パスの通ったフォルダに配置すればOK。


■C#サンプル
UNLHA32.DLLの利用メソッドは以下の通り。
C言語ライブラリのためDllImport宣言が必要。


■LZH圧縮・解凍
[DllImport("UNLHA32.DLL", CharSet = CharSet.Ansi)]
int Unlha(
    IntPtr hwnd,            // ウィンドウハンドル
    string szCmdLine,       // コマンドライン
    StringBuilder szOutput, // 処理結果文字列
    int dwSize);            // 引数szOutputの文字列サイズ

第2引数のコマンド書式は、こんな感じ。

[<command>] [[-<switch>[+|-|0|1|2]]...] <archive_file_name>[.LZH]
  [[<base_directory_name>\] [<path_name>|<wild_name>]...]]...

command:命令
switch:スイッチ
archive_file_name:書庫名
base_directory_name:基準ディレクトリ(以降、基準フォルダと表記)
path_name:パス(ファイル)名
wild_name:ワイルドカード

本サンプル内で利用したコマンドラインは以下の通り。
コマンドライン 説明
a -jso1 archive.lzh <ファイルパス1> <ファイルパス2>... <ファイルパス1> <ファイルパス2> ... をarchive.lzhファイルに圧縮。
a -d1 -jso1 archive.lzh <基準フォルダ> <フォルダパス\*> <フォルダパス>をサブフォルダ・ファイル構成を守ったままarchive.lzhファイルに圧縮。
x -r2 -jf0 -jso1 archive.lzh <基準フォルダ> archive.lzhファイルを圧縮時と同じフォルダ・ファイル構成で、基準フォルダ上にarchiveというフォルダを作り解凍。
詳細についてはこのサイトやDLL付属のCOMAND.TXTを参考。


サンプルソースのLZH操作クラス(LzhManager)の公開機能は以下の通り
機能概要 メソッド名
LZH圧縮[複数ファイル] fnCompressFiles()
LZH圧縮[フォルダ指定] fnCompressFolder()
LZH解凍 fnExtract()
Oncemail LabからASP.NETから利用したときの実行結果及びソースを確認できる。
※Oncemail Labでは「LZH圧縮[複数ファイル]」サンプルのみ実行可能。


using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

/// <summary>
/// LZH操作クラス(UNLHA32.DLLのラッパークラス)
/// </summary>
/// <remarks>
/// 【注意】
/// UNLHA32.DLLをC:\Windows\などパスの通った場所に保存していること!!
///  DLL取得元:統合アーカイバプロジェクト
/// http://www.madobe.net/archiver/index.html
/// </remarks>
public static class LzhManager
{
    /// <summary>
    /// ロックオブジェクト
    /// </summary>
    private static readonly object m_oLockObject = new object();

    /// <summary>
    /// [DLL Import] Unlhaのコマンドラインメソッド
    /// </summary>
    /// <param name="hwnd">ウィンドウハンドル(=0)</param>
    /// <param name="szCmdLine">コマンドライン</param>
    /// <param name="szOutput">実行結果文字列</param>
    /// <param name="dwSize">実行結果文字列格納サイズ</param>
    /// <returns>
    /// 0:正常、0以外:異常終了
    /// </returns>
    [DllImport("UNLHA32.DLL", CharSet = CharSet.Ansi)]
    private static extern int Unlha(IntPtr hwnd, string szCmdLine, StringBuilder szOutput, int dwSize);

    /// <summary>
    /// LZH圧縮[複数ファイル]
    /// </summary>
    /// <param name="aryFilePath">圧縮対象ファイル一覧(フルパス指定)</param>
    /// <param name="sLzhFilePath">LZHファイル名</param>
    public static void fnCompressFiles(List<string> aryFilePath, string sLzhFilePath)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbCmdLine = new StringBuilder(1024);   // コマンドライン文字列
            StringBuilder sbOutput = new StringBuilder(1024);    // UNLHA32.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // a:書庫にファイルを追加
            // -jso1:ファイル排他制御
            sbCmdLine.AppendFormat("a -jso1 \"{0}\"", sLzhFilePath);
            // 圧縮対象ファイルをコマンドライン化
            foreach (string sFilePath in aryFilePath)
            {
                sbCmdLine.AppendFormat(" \"{0}\"", sFilePath);
            }
            string sCmdLine = sbCmdLine.ToString();
            //---------------------------------------------------------------------------------
            // 圧縮実行
            //---------------------------------------------------------------------------------
            int iUnlhaRtn = Unlha((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckLzhProc(iUnlhaRtn, sbOutput);
        }
    }
    /// <summary>
    /// LZH圧縮[フォルダ指定]
    /// </summary>
    /// <param name="sFolderPath">圧縮対象フォルダ(フルパス指定)</param>
    /// <param name="sLzhFilePath">LZHファイル名</param>
    public static void fnCompressFolder(string sFolderPath, string sLzhFilePath)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbOutput = new StringBuilder(1024);   // UNLHA32.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // a:書庫にファイルを追加]
            // -d1:ディレクトリ (配下) の格納
            // -jso1:ファイル排他制御
            string sCmdLine = string.Format(
                "a -d1 -jso1 \"{0}\" \"{1}\"\\ \"{2}\\*\"",
                sLzhFilePath, Directory.GetParent(sFolderPath).FullName, sFolderPath);
            //---------------------------------------------------------------------------------
            // 圧縮実行
            //---------------------------------------------------------------------------------
            int iUnlhaRtn = Unlha((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckLzhProc(iUnlhaRtn, sbOutput);
        }
    }
    /// <summary>
    /// LZH解凍
    /// </summary>
    /// <param name="sLzhFilePath">LZHファイル名</param>
    /// <param name="sDustFolder">出力先フォルダ</param>
    public static void fnExtract(string sLzhFilePath, string sDustFolder)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbOutput = new StringBuilder(1024);   // UNLHA32.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -x:解凍
            // -r2:ディレクトリ指定再帰モード
            // -jf0:指定した基準ディレクトリからの相対パスで展開
            // -jso1:ファイル排他制御
            string sCmdLine = string.Format(
                "x -r2 -jf0 -jso1 \"{0}\" \"{1}\\\"", sLzhFilePath, sDustFolder);
            //---------------------------------------------------------------------------------
            // 解凍実行
            //---------------------------------------------------------------------------------
            int iUnlhaRtn = Unlha((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckLzhProc(iUnlhaRtn, sbOutput);
        }
    }
    /// <summary>
    /// Unlhaメソッド成功判定
    /// </summary>
    /// <param name="iUnlhaRtn">Unlhaメソッドの戻り値</param>
    /// <param name="sbLzhOutputString">Unlhaメソッドの第3引数</param>
    private static void fnCheckLzhProc(int iUnlhaRtn, StringBuilder sbLzhOutputString)
    {
        //-------------------------------------------------------------------------------------
        // メソッドの戻り値=0なら正常終了
        //-------------------------------------------------------------------------------------
        if (iUnlhaRtn == 0)
            return;
        //-------------------------------------------------------------------------------------
        // 例外をスロー
        //-------------------------------------------------------------------------------------
        string sMsg = string.Format(
            "LZH圧縮/解凍処理に失敗:\nエラーコード={0}:\n{1}", iUnlhaRtn, sbLzhOutputString);
        throw new ApplicationException(sMsg);
    }
}



using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        List<string> aryFiles = new List<string>();
        aryFiles.Add(@"C:\temp\Excel\Book1.xls");
        aryFiles.Add(@"C:\temp\Word\Word1.doc");
        string sFolder = @"C:\temp";

        // ファイル圧縮
        File.Delete(@"c:\temp\lzhFiles.lzh");
        LzhManager.fnCompressFiles(aryFiles, @"c:\temp\lzhFiles.lzh");
        // フォルダ圧縮
        File.Delete(@"c:\temp\lzhFolder.lzh");
        LzhManager.fnCompressFolder(sFolder, @"c:\temp\lzhFolder.lzh");
        // ファイル解凍
        LzhManager.fnExtract(@"c:\temp\lzhFiles.lzh", @"c:\temp\temp");
    }
}

■注意点
UNLHA32.DLLを使う際に気がついた注意点は以下の通り。

  • ファイル名にUnicodeが利用できない(らしい)。
  • 暗号化機能がない。
  • マルチスレッドでは排他処理が必須。ファイル排他は" -jso1"スイッチ。
  • 64BitOSで動かす際にはアプリケーションを32Bitモードで動かさないとDLLリンクでエラーになる。(.NETアプリのデフォルトはAnyCPUなので設定変更しないとアウト)

「Unicodeが利用できない」「暗号化機能」についてはLHA - Wikipediaを参照。
「マルチスレッド~」は付属ドキュメントCOMMAND.TXTを参考。

64bitOSで動かしたい場合、NET Frameworkアプリケーションを64bit OS上で32bitモードで動かす方法を参照。


■関連ページ


正式版Internet Explorer 8(IE8)を使ってみた

正式版Internet Explorer 8(IE8)を使ってみた。


■最初に
2009年3月20日にInternet Explorer 8の正式版をリリース。

<ダウンロード先>
Internet Explorer 8: ホーム ページ

起動画面

■体感速度
IE7と比べて起動・ページ読込等のレスポンスが格段と高速になった。
特に画像が多くレスポンスが悪かったサイトはハッキリ体感できた。
でもマイクロソフトが宣伝していた「Google Chromeよりも高速!!」ってな感じは受けなかった。
個人的な感想では
Chrome 2.0β > Chrome 1.0 >= IE8 >> Firefox 3.0 >= Opera 12 > IE7

■お気に入りバー
IE7と比べ画面イメージが異なったのはアドレスバーの下・お気に入りボタンの横の空欄である。
ここに良く使うサイトのショートカットを登録できる。
従来のお気に入り機能よりも手軽に使えるため2つ以上のサイトを掛け持ちする際にとっても便利!!
Chromeのパクリっぽいけどね~

■アクセラレータ
文字列選択→右クリックでアクセラレータ機能が追加された。
「Web検索・翻訳・地図検索・etc.」が簡単に出来るようになり非常に便利!!

アクセラレータ


Web検索...Live Search検索の他にデフォルト登録した検索サイトが使える。




翻訳検索...右クリックメニュー上で翻訳の簡易表示→Live Search翻訳ページへリンクができる。




地図検索...右クリックメニュー上で地図候補が現れ→Live Search Mapsページへリンクする。



■検索候補
左上の検索ボックスでキーワード入力すると検索候補が出てくる。
Firefoxからパクった感じだけど便利だから良し!!

■タブグループ
ハイバーリンクから新たなタブを開くと色でグルーピングされる。
1つのブラウザでいくつもの調べ物をするときは便利に使えそう。

■ページ内検索
ページ内検索が変更された。
変更点は
①検索ダイアログから画面上部に検索エリア表示に変更。
②検索結果をカラフル(太文字・背景色:黄色)に表示。
③ヒット件数を表示。
やっと他のブラウザに追いついた感じ。

■開発者ツール
開発者向けの付属ツール。
JavaScriptのデバッグが出来る。
HP作成者にとって一押しの機能!!
IE8の開発者ツールはVisual StudioのVB・C#等のデバッグ機能には劣るが、かなり使い勝手が良い。
FireFoxのアドオンFirebugのパクリっぽいけどね~。

JavaScriptエラー発生画面


開発者ツール


ブレークポイントやデバッグの開始機能もある。


クイックウォッチが使える。...Visual StudioのJavaScriptデバッグ機能と違い正しい変数が表示されている。


コールスタックも使える。

■不具合?
うちの環境だけかもしれないが...
①ページを戻る機能を使った際にスクロール位置が正しく反映されない。
②時々固まる。(これはIE7以前からだが...)
③幾つかの地図系ページで上手く動かない。

■簡単に使ってみた印象
○IE7と比べレスポンスが格段と向上した。
○他のブラウザから良い機能を吸収しているし、新機能のアクセラレータ機能は非常に便利!!
○開発者ツールはJavaScript利用時に非常に使える。
△Chromeみたいにタブ単位で別ウィンドウに分割・結合できる機能が欲しかった。
△Chromeみたいに読み込み中画像も段階的に表示する機能が欲しかった。
△アクセラレータ機能に国語辞書・類語辞書機能が欲しかった。
×アクセラレータ機能がLive Searchと直結しているため、Live Searchの宣伝にも感じてしまう。

IE7ユーザなら(機能面だけを考えれば)IE8へ移行した方が良い。
その他ブラウザ利用者でもインストールするメリットはある。


サービスアプリ追加(Officeファイルバージョン変換)

Oncemail LabOfficeファイルバージョン変換サービスを追加。


■サービス公開先
Oncemail Lab


■2009/03/21時点での公開サービス

サービス名概要
OfficeファイルをPDFファイル変換 Excel・Word・PowerPointファイルをPDFファイルに変換します。
Officeファイルバージョン変換 Excel・Word・PowerPointファイルのファイルバージョンを変換します。
PDFファイルにパスワード設定 PDFファイルにパスワードを設定します。
PDFをファイル結合 2つのPDFファイルを1つのPDFファイルに結合します。
ファイルをZIP圧縮 ファイルをZIP圧縮します。

サービスアプリケーション公開

これまで ASP.NETサンプルで作ったサンプル等を開発者だけでなく一般利用者が使えるように公開した。


■サービス公開先
Oncemail Lab


■2009/03/21時点での公開サービス

サービス名概要
OfficeファイルをPDFファイル変換 Excel・Word・PowerPointファイルをPDFファイルに変換します。
PDFファイルにパスワード設定 PDFファイルにパスワードを設定します。
PDFをファイル結合 2つのPDFファイルを1つのPDFファイルに結合します。
ファイルをZIP圧縮 ファイルをZIP圧縮します。

C#でZIPの圧縮・解凍

C#でZIPの圧縮・解凍を行うサンプルを紹介する。
.NET FrameworkでZIP操作方法は幾つか存在するが、本サンプルでは ZIP32.dll・ZIP32J.dll・UNZIP32.DLLというフリーライブラリー(C言語DLL)を利用。


■各種DLLの準備方法
ZIP32.dll・ZIP32J.dll・UNZIP32.DLLは統合アーカイバプロジェクトからダウンロードできる。
必要な物は以下の通り。

DLL 説明
ZIP32.dll ZIP圧縮用ライブラリ。
ZIP32J.DLL ZIP32.dllを統合アーカイバ化するための「足継ぎ」ライブラリ。
UNZIP32.DLL ZIP展開(解凍)用ライブラリ。
これらDLLファイルをC:\WindowsやC:\Windows\System32等パスの通ったフォルダに配置すればOK。


■C#サンプル
ZIP32J.DLLやUNZIP32.DLLの利用メソッドは以下の通り。
これらはC言語ライブラリのためDllImport宣言が必要。


■ZIP圧縮
[DllImport("ZIP32J.DLL", CharSet = CharSet.Ansi)]
int Zip(
    IntPtr hwnd,            // ウィンドウハンドル
    string szCmdLine,       // コマンドライン
    StringBuilder szOutput, // 処理結果文字列
    int dwSize);            // 引数szOutputの文字列サイズ

■ZIP解凍
[DllImport("UNZIP32.DLL", CharSet = CharSet.Ansi)]
int UnZip(
    IntPtr hwnd,            // ウィンドウハンドル
    string szCmdLine,       // コマンドライン
    StringBuilder szOutput, // 処理結果文字列
    int dwSize);            // 引数szOutputの文字列サイズ

第2引数のコマンドラインは、こんな感じに設定する。
[[-スイッチ]...] [アーカイブ名][拡張子] [ベースフォルダ] [パス|ファイル名]

本サンプル内で利用したコマンドラインスイッチは以下の通り。
スイッチ 説明 Zipメソッド UnZipメソッド
-r 再帰検索[フォルダ指定したときに有効]  
-j ファイル名のパスを保存しない  
-x 解凍  
-o 既存ファイルが存在する場合、強制的に上書き  
-q 静かな実行[余分な処理結果を出力しない]
-P パスワード指定
コマンドラインについてはこのサイトや各種DLLのドキュメントを参考のこと。


サンプルソースのZIP操作クラス(ZipManager)の公開機能は以下の通り
機能概要 メソッド名
ZIP圧縮[複数ファイル] fnCompressFiles()
ZIP圧縮[複数ファイル・パスワード指定] fnCompressFilesWithPassword()
ZIP圧縮[フォルダ指定] fnCompressFolder()
ZIP圧縮[フォルダ指定・パスワード指定] fnCompressFolderWithPassword()
ZIP解凍 fnExtract()
ZIP解凍[パスワード指定] fnExtractWithPassword()
OnceMail LabからASP.NETから利用したときの実行結果及びソースを確認できる。
※OnceMail Labでは「ZIP圧縮[複数ファイル]」と「ZIP圧縮[複数ファイル・パスワード指定]」のサンプルのみ実行可能。


using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

/// <summary>
/// ZIP操作クラス(ZIP32.dll・ZIP32J.dll・UNZIP32.DLLのラッパークラス)
/// </summary>
/// <remarks>
/// 【注意】
/// ZIP32.dll・ZIP32J.dll・UNZIP32.DLLをC:\Windows\などパスの通った場所に保存していること!!
///  DLL取得元:統合アーカイバプロジェクト
/// http://www.madobe.net/archiver/index.html
/// </remarks>
public static class ZipManager
{
    /// <summary>
    /// ロックオブジェクト
    /// </summary>
    private static readonly object m_oLockObject = new object();

    /// <summary>
    /// [DLL Import] ZIP圧縮
    /// </summary>
    /// <param name="hwnd">ウィンドウハンドル(=0)</param>
    /// <param name="szCmdLine">コマンドライン</param>
    /// <param name="szOutput">実行結果文字列</param>
    /// <param name="dwSize">実行結果文字列格納サイズ</param>
    /// <returns>
    /// 0:正常、0以外:異常終了
    /// </returns>
    [DllImport("ZIP32J.DLL", CharSet = CharSet.Ansi)]
    private static extern int Zip(IntPtr hwnd, string szCmdLine, StringBuilder szOutput, int dwSize);
    /// <summary>
    /// [DLL Import] ZIP解凍
    /// </summary>
    /// <param name="hwnd">ウィンドウハンドル(=0)</param>
    /// <param name="szCmdLine">コマンドライン</param>
    /// <param name="szOutput">実行結果文字列</param>
    /// <param name="dwSize">実行結果文字列格納サイズ</param>
    /// <returns>
    /// 0:正常、0以外:異常終了
    /// </returns>
    [DllImport("UNZIP32.DLL", CharSet = CharSet.Ansi)]
    private static extern int UnZip(IntPtr hwnd, string szCmdLine, StringBuilder szOutput, int dwSize);
    
    /// <summary>
    /// ZIP圧縮[複数ファイル]
    /// </summary>
    /// <param name="aryFilePath">圧縮対象ファイル一覧(フルパス指定)</param>
    /// <param name="sZipFilePath">ZIPファイル名</param>
    public static void fnCompressFiles(List<string> aryFilePath, string sZipFilePath)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbCmdLine = new StringBuilder(1024);   // コマンドライン文字列
            StringBuilder sbOutput = new StringBuilder(1024);    // ZIP32J.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -q:静かな実行[余分な処理結果を出力しない]
            // -j:ファイル名のパスを保存しない
            sbCmdLine.AppendFormat("-q -j \"{0}\"", sZipFilePath);
            // 圧縮対象ファイルをコマンドライン化
            foreach (string sFilePath in aryFilePath)
            {
                sbCmdLine.AppendFormat(" \"{0}\"", sFilePath);
            }
            string sCmdLine = sbCmdLine.ToString();
            //---------------------------------------------------------------------------------
            // 圧縮実行
            //---------------------------------------------------------------------------------
            int iZipRtn = Zip((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckZipResult(iZipRtn, sbOutput);
        }
    }
    /// <summary>
    /// ZIP圧縮[複数ファイル・パスワード指定]
    /// </summary>
    /// <param name="aryFilePath">圧縮対象ファイル一覧(フルパス指定)</param>
    /// <param name="sZipFilePath">ZIPファイル名</param>
    /// <param name="sPassword">パスワード(半角英数字)</param>
    public static void fnCompressFilesWithPassword(List<string> aryFilePath, string sZipFilePath, string sPassword)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbCmdLine = new StringBuilder(1024);   // コマンドライン文字列
            StringBuilder sbOutput = new StringBuilder(1024);    // ZIP32J.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -q:静かな実行[余分な処理結果を出力しない]
            // -j:ファイル名のパスを保存しない
            // -P password:パスワード指定
            sbCmdLine.AppendFormat("-q -j -P {0} \"{1}\"", sPassword, sZipFilePath);
            // 圧縮対象ファイルをコマンドライン化
            foreach (string sFilePath in aryFilePath)
            {
                sbCmdLine.AppendFormat(" \"{0}\"", sFilePath);
            }
            string sCmdLine = sbCmdLine.ToString();
            //---------------------------------------------------------------------------------
            // 圧縮実行
            //---------------------------------------------------------------------------------
            int iZipRtn = Zip((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckZipResult(iZipRtn, sbOutput);
        }
    }
    /// <summary>
    /// ZIP圧縮[フォルダ指定]
    /// </summary>
    /// <param name="sFolderPath">圧縮対象フォルダ(フルパス指定)</param>
    /// <param name="sZipFilePath">ZIPファイル名</param>
    public static void fnCompressFolder(string sFolderPath, string sZipFilePath)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbOutput = new StringBuilder(1024);   // ZIP32J.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -r:再帰検索[フォルダ指定したときに有効]
            // -q:静かな実行[余分な処理結果を出力しない]
            string sCmdLine = string.Format(
                "-r -q \"{0}\" \"{1}\"\\ \"{2}\\*\"",
                sZipFilePath, Directory.GetParent(sFolderPath).FullName, sFolderPath);
            //---------------------------------------------------------------------------------
            // 圧縮実行
            //---------------------------------------------------------------------------------
            int iZipRtn = Zip((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckZipResult(iZipRtn, sbOutput);
        }
    }
    /// <summary>
    /// ZIP圧縮[フォルダ指定・パスワード指定]
    /// </summary>
    /// <param name="sFolderPath">圧縮対象フォルダ(フルパス指定)</param>
    /// <param name="sZipFilePath">ZIPファイル名</param>
    /// <param name="sPassword">パスワード(半角英数字)</param>
    public static void fnCompressFolderWithPassword(string sFolderPath, string sZipFilePath, string sPassword)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbOutput = new StringBuilder(1024);   // ZIP32J.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -r:再帰検索[フォルダ指定したときに有効]
            // -q:静かな実行[余分な処理結果を出力しない]
            // -P password:パスワード指定
            string sCmdLine = string.Format(
                "-r -q -P {0} \"{1}\" \"{2}\"\\ \"{3}\\*\"",
                sPassword, sZipFilePath, Directory.GetParent(sFolderPath).FullName, sFolderPath);
            //---------------------------------------------------------------------------------
            // 圧縮実行
            //---------------------------------------------------------------------------------
            int iZipRtn = Zip((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckZipResult(iZipRtn, sbOutput);
        }
    }
    /// <summary>
    /// ZIP解凍
    /// </summary>
    /// <param name="sZipFilePath">ZIPファイル名</param>
    /// <param name="sDustFolder">出力先フォルダ</param>
    public static void fnExtract(string sZipFilePath, string sDustFolder)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbOutput = new StringBuilder(1024);   // UNZIP32.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -x:解凍
            // -o:既存ファイルが存在する場合、強制的に上書き
            // -q:静かな実行[余分な処理結果を出力しない]
            string sCmdLine = string.Format(
                "-x -o -q \"{0}\" \"{1}\\\" *.*", sZipFilePath, sDustFolder);
            //---------------------------------------------------------------------------------
            // 解凍実行
            //---------------------------------------------------------------------------------
            int iZipRtn = UnZip((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckZipResult(iZipRtn, sbOutput);
        }
    }
    /// <summary>
    /// ZIP解凍[パスワード指定]
    /// </summary>
    /// <param name="sZipFilePath">ZIPファイル名</param>
    /// <param name="sDustFolder">出力先フォルダ</param>
    /// <param name="sPassword">パスワード(半角英数字)</param>
    public static void fnExtractWithPassword(string sZipFilePath, string sDustFolder, string sPassword)
    {
        lock (m_oLockObject)
        {
            StringBuilder sbOutput = new StringBuilder(1024);   // UNZIP32.dll出力文字
            //---------------------------------------------------------------------------------
            // コマンドライン文字列の作成
            //---------------------------------------------------------------------------------
            // -x:解凍
            // -o:既存ファイルが存在する場合、強制的に上書き
            // -q:静かな実行[余分な処理結果を出力しない]
            // -P password:パスワード指定
            string sCmdLine = string.Format(
                "-x -o -q -P {0} \"{1}\" \"{2}\\\" *.*", sPassword, sZipFilePath, sDustFolder);
            //---------------------------------------------------------------------------------
            // 解凍実行
            //---------------------------------------------------------------------------------
            int iZipRtn = UnZip((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity);
            //---------------------------------------------------------------------------------
            // 成功判定
            //---------------------------------------------------------------------------------
            fnCheckZipResult(iZipRtn, sbOutput);
        }
    }
    /// <summary>
    /// ZIP/UnZipメソッド成功判定
    /// </summary>
    /// <param name="iZipRtn">Zip/UnZipメソッドの戻り値</param>
    /// <param name="sbZipOutputString">ZIPメソッドの第3引数</param>
    private static void fnCheckZipResult(int iZipRtn, StringBuilder sbZipOutputString)
    {
        //-------------------------------------------------------------------------------------
        // メソッドの戻り値=0なら正常終了
        //-------------------------------------------------------------------------------------
        if (iZipRtn == 0)
            return;
        //-------------------------------------------------------------------------------------
        // 例外をスロー
        //-------------------------------------------------------------------------------------
        string sMsg = string.Format(
            "ZIP圧縮/解凍処理に失敗:\nエラーコード={0}:\n{1}", iZipRtn, sbZipOutputString);
        throw new ApplicationException(sMsg);
    }
}



using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        List<string> aryFiles = new List<string>();
        aryFiles.Add(@"C:\temp\Excel\Book1.xls");
        aryFiles.Add(@"C:\temp\Word\Word1.doc");
        string sFolder = @"C:\temp";

        // ファイル圧縮
        File.Delete(@"c:\temp\zipFiles.zip");
        ZipManager.fnCompressFiles(aryFiles, @"c:\temp\zipFiles.zip");
        // パスワード指定ファイル圧縮
        File.Delete(@"c:\temp\zipFilesWithPassword.zip");
        ZipManager.fnCompressFilesWithPassword(aryFiles, @"c:\temp\zipFilesWithPassword.zip", "aaa");
        // フォルダ圧縮
        File.Delete(@"c:\temp\zipFolder.zip");
        ZipManager.fnCompressFolder(sFolder, @"c:\temp\zipFolder.zip");
        // パスワード指定フォルダ圧縮
        File.Delete(@"c:\temp\zipFolderWithPassword.zip");
        ZipManager.fnCompressFolderWithPassword(sFolder, @"c:\temp\zipFolderWithPassword.zip", "aaa");
        // ファイル解凍
        ZipManager.fnExtract(@"c:\temp\zipFolder.zip", @"c:\temp\temp");
        // パスワード指定ファイル解凍
        ZipManager.fnExtractWithPassword(@"c:\temp\zipFolderWithPassword.zip", @"c:\temp\temp2", "aaa");
    }
}

■注意点
ZIP32.dll・ZIP32J.dll・UNZIP32.DLLを使う際に気がついた注意点は以下の通り。

  • ファイルサイズが4GBを超えると動かない。ZIPの仕様(?)
  • 64BitOSで動かす際にはアプリケーションを32Bitモードで動かさないとDLLリンクでエラーになる。(.NETアプリのデフォルトはAnyCPUなので設定変更しないとアウト)

64bitOSで動かしたい場合、NET Frameworkアプリケーションを64bit OS上で32bitモードで動かす方法を参照。


■関連ページ


« 2009年2月 | トップページ | 2009年5月 »

Google AdSense


  • ---

Amazon ウィジェット

  • ウィジェット

@niyo_naのツイート

無料ブログはココログ

Google Analytics