QuadrupleD専用アーカイブ、QDA形式ファイルへのアクセスを行うためのユニットです。
type TQDAFileHeader = packed record Compress:DWord; Signature:Array[0..3] of Char; DataCount:DWord; Reserved:Array[1..244] of BYTE; end;
QuadrupleD専用アーカイブ形式を持ったファイルの、ファイル全体の情報を表現します。
含まれるメンバの意味は以下の通りです。
Compress
アーカイブが圧縮アーカイブなら1、そうでないなら0です
Signature
アーカイブのIDです。現バージョンのQuadrupleDアーカイブでは、'QDA0'という文字列が入っています
DataCount
アーカイブに含まれるデータの個数です
Reserved
将来の拡張のため、予約されています
type TQDADataHeader = packed record Offset:DWord; Length:DWord; RestoredLength:DWord; ID:Array[0..255] of Char; end;
QuadrupleD専用アーカイブ形式を持ったファイル内に含まれる、個々のデータについての情報を表現します
含まれるメンバの意味は以下の通りです。
Offset
そのデータのQDAファイル内の、ファイル先頭からの格納位置(バイト単位)
Length
そのデータの、QDAファイル内でのサイズ(バイト単位)
RestoredLength
そのデータの、解凍後のサイズ(バイト単位)
ID
そのデータを解凍する際のID
type TQDANotifyEvent = procedure (Progress,FileCount:Integer; SourceFile:String) of object;
この型は、CreateQDAFileの圧縮の過程で呼び出されるコールバック関数の型を表現します。1個のデータの圧縮が完了した時点で呼ばれます。
Progress個のファイルが、現在までに完了したファイルの個数であり、FileCountが圧縮ファイルの総数です。また、SourceFileには最後に圧縮を完了したファイル名が渡されます。
procedure CreateQDAFile(FileName:String; SourceFile, IDs:TStrings; doCompress:Boolean; callback:TQDANotifyEvent);
FileNameで示されるQDAファイルを作成します。
SourceFileがQDAファイルに格納されるデータの読み出し元となるファイルで、それぞれのデータはIDsで示されるIDを付けてQDAファイルの中に保存されます。
SourceFileに含まれる文字列の数と、IDsに含まれる文字列の数は同じで無ければなりません。
doCompressは、圧縮するか否かのフラグで、Trueを指定すると個々のデータを圧縮して保存します。
CreateQDAFile手続きによるアーカイブファイル作成は、圧縮対象となるファイルが多かったり、サイズが大きかったりする場合、長い時間の掛かる場合があります。
ファイル1個がアーカイブファイルに格納される度に、callbackで示される関数が呼び出されます。
function ExtractFromQDAFile(FileName:String; ID:String):TMemoryStream; function ExtractFromQDAStream(Source:TStream; ID:String):TMemoryStream;
FileNameで示されるQDAファイルまたは、Streamで示されるQDAファイルを格納したTStreamオブジェクトから、IDというデータIDを持ったデータを取り出して、TMemoryStreamオブジェクトとして返します。
例
test.qdaというファイルから、TEST.BMPというIDを持ったデータを取り出して、TBitmapオブジェクト変数bmpに格納する例を示します。
var
bmp:TBitmap
procedure ExtractTest;
var
ms:TMemoryStream;
begin
//抽出
ms:=ExtractFromQDAFile('test.qda', 'TEST.BMP');
//bmpオブジェクトに読みこませる
bmp.LoadFromStream(ms);
//使い終わったTMemoryStreamオブジェクトは、必ず呼び出し側で解放してください
ms.Free;
end;
function GetQDAFileInfo(FileName:String):TQDAFileHeader;
FileNameで示されるQDAファイルのヘッダ情報を取得します。
function GetQDADataInfo(FileName:String; index:Integer):TQDADataHeader;
FileNameで示されるQDAファイルの、index番目(0が先頭)のデータについてのヘッダ情報を取得します。