統合アーカイバコンポーネントを使用して、
暗号化書庫を普通の書庫にするソフトを作ろうとしているのですが、
正常に終了していないのに0を返してくる書庫や、
正常に終了して、CRCチェックをしようと書庫内のファイル検索をするといきなり-1(検索終了)を返してきたりする書庫があります。
現在、
書庫解凍
返り値が0なら"*.*"で書庫内検索
返り値がいきなり-1なら異常
そうでなかったら返り値が0以外になるまでファイルを繰り返しCRCチェック
という流れでやっているのですが、
正常に解凍できたかの判断はどうすればよろしいでしょうか?
ソースはこんな感じなのですが・・・
cond := arc.UnpackFiles(handle, nil, outputdir, [nil]);
//正常に解凍できたら
if cond = $0000 then begin
//CRCチェック
ErrCRC := False;
j := arc.FindOpen(handle, M_CHECK_ALL_PATH);
j := arc.FindFirst('*.*', IndivisualInfo);
//いきなり検索終了したら正常ではない
if j = -1 then begin
end;
//一つずつCRC比較
while j = 0 do begin
tmp := IndivisualInfo.szFileName;
tmp := AnsiReplaceStr(tmp, '/', '\');
//不正なファイル名の書庫対応
tmp := AnsiReplaceStr(tmp, '>', '_');
tmp := AnsiReplaceStr(tmp, '<', '_');
ArcCRC := '$' + IntToHex(IndivisualInfo.dwCRC, 8);
FileCRC := CRC32File(outputdir + '\' + tmp);
if CompareText(ArcCRC, FileCRC) <> 0 then begin
ErrCRC := True;
Break;
end;
j := arc.FindNext(IndivisualInfo);
end;
arc.FindClose;
if ErrCRC then Continue;
1.書庫内のファイル数とCRCを取得、メモリに格納
2.実際に解凍してみる
3.解凍エラーがでた → 正常ではない
解凍できたが、CRCが一致しない → 正常ではない
という感じでどうでしょう?
>ファイル検索をするといきなり-1(検索終了)を返してきたりする書庫
これに関しては一度ハンドルを開放して、もう一度接続するとか
>さささん
その方法でやろうとしたのですが、
IndivisualInfoのszFileNameに格納されているファイル名が不正な場合がありまして、
CRCを比較する際のファイル名が決定できないことがあるのです。
後出しで申し訳ないのですが、複数の書庫をリストで順番に処理するように考えているので
毎回(解凍失敗していても)CRCチェックをするとコストがかかりすぎる気がするのですが、
解凍後の返り値の信頼性が低いので毎回チェックするしかないのでしょうか・・・?
ファイル名が不正ならその時点でエラーにしてもいい気がしますけど。
あるいはStringGridあたりで解凍前と解凍後のファイル名をリストで保持しておいて、
CRCを比較するときにはリストを使ってファイル名を確定すればいいかと。
CPUコストに関しては、
・高速モード:全体ファイル数と全体ファイルサイズ(or個別ファイルサイズ)が一致
・精密モード:CRC比較
ということで選択できるように実装したらいいんじゃないでしょうか。
あとCRC計算がシングルスレッドなのであれば、
スレッド立てて計算すれば時間自体は短縮できますし。
ツイート | ![]() |