■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());
}
|
|