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

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

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

GCAで圧縮されたファイルの一部を解凍するには?


(過去ログ 32 を表示中)

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

■15907 / inTopicNo.1)  GCAで圧縮されたファイルの一部を解凍するには?
  
□投稿者/ まぐねしうむ (22回)-(2008/03/25(Tue) 12:00:10)

分類:[C#] 

お世話になります。
http://codezine.jp/a/article/aid/444.aspx?p=1
の記事を参考にして圧縮ファイル内の特定のファイルを解凍する
処理を作成しましたがDLLからのエラーにより解凍できません。

どなたか教えてください。
ちなみに、圧縮されたファイルをそのまま解凍するのは出来ております。
圧縮内の特定ファイルのみ解凍が出来ません。

    /// <summary>
    /// UNgca32.DLLで書庫を展開する ファイル指定
    /// </summary>
    /// <param name="archiveFile">書庫ファイル名</param>
    /// <param name="targetFiles">解凍したファイル</param>
    /// <param name="extractTo">展開先のフォルダ名</param>
    public static void gcaExtractArchive(string archiveFile, string targetFiles, string extractTo)
    {
        int ret = 0;
        StringBuilder output = new StringBuilder(1024);

        //指定されたファイルがあるか調べる
        if (!System.IO.File.Exists(archiveFile))
        {
            throw new ApplicationException("指定されたファイル'" + archiveFile + "'が存在しません。");
        }

        //DLLの存在を確認
        IntPtr pathPtr;
        if (SearchPath(null, "ungca32.dll", null, 0, null, out pathPtr) == 0)
        {
            throw new ApplicationException("UNgca32.DLLが見つかりません。");
        }

        //DLLのチェック
        try
        {
            ushort ver = UnGCAGetVersion();
            Console.WriteLine("UNgca32.DLLのバージョン:{0:0.00}", ver / 100f);
        }
        catch
        {
            throw new ApplicationException(
                "UNgca32.DLLがインストールされていません。");
        }

        //動作中かチェック
        if (UnGCAGetRunning())
        {
            throw new ApplicationException(
                "UNgca32.DLLが現在動作中です。");
        }

        //展開先フォルダの作成
        DirectoryInfo createdDir = null;
        if (!Directory.Exists(extractTo))
        {
            createdDir = Directory.CreateDirectory(extractTo);
        }

        //ファイル名とフォルダ名を修正する
        archiveFile = ToCommandStringFromFile(archiveFile);

        //フォルダ名は必ず\で終わる必要がある
        string baseDir = extractTo;
        if (!baseDir.EndsWith("\\"))
            baseDir += "\\";
        baseDir = ToCommandStringFromFile(baseDir);
        
        string cmd = string.Format("ex -p " + decryptKey + " {0} {1} {2} ", archiveFile, baseDir, targetFiles);

        System.Diagnostics.Debug.WriteLine(IntPtr.Zero + "/" + cmd + "/" + output + "/" + (uint)output.Capacity);
        
        ret = UnGCA(IntPtr.Zero, cmd, output, (uint)output.Capacity); //★この後にUnGca32.DllからErrが出る

        //結果
        if (ret != 0)
        {
            //展開先フォルダが空の時は削除(削除できないかも)
            if (createdDir != null && createdDir.GetFileSystemInfos().Length == 0)
            {
                try
                {
                    createdDir.Delete();
                }
                //★処理どうする?
                catch
                {
                    throw new ApplicationException("書庫の展開に失敗しました。");
                }
            }
            throw new ApplicationException("書庫の展開に失敗しました。");
        }
        Console.WriteLine(output.ToString());
    }

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -