2012-06-06 67 views
3

我需要管理.Z(Unix壓縮)文件,主要是dezip函數。 什麼是最好的圖書館來做到這一點? 預先避免DLL(如7z.dll)。 編輯:今天我有一個與7z.dll接口的JCL壓縮庫的解決方案。 我只是想尋找更簡單的解決方案&,因爲我只需要'.Z'的解析函數。Delphi XE2 .Z Unix壓縮文件庫

+0

.Z文件由ZLIB讀寫,用C語言編寫.Delphi的幾個部分都使用它,因此delphi包含了二進制'.obj'文件版本(使用舊版Borland C編譯器編譯)。你可以靜態鏈接到它。 Jedi JCL庫顯示如何使用它的示例文件夾,JVCL用TJvZLibMultiple封裝組件形式的Jedi JCL包裝器。 http://stackoverflow.com/questions/1450510/compress-all-files-but-skip-one –

+0

@WarrenP我還沒試過JCL/JVCL,但TJvZLibMultiple似乎沒有認出.Z,當我嘗試JCL壓縮的例子時需要7z DLL。 – philnext

+1

@Warren,.Z文件由'compress'工具管理,該工具使用* LZW *壓縮算法。 Zlib使用* deflate *算法處理.gz和.zip文件。 'gzip'工具雖然經典地是Zlib的一個接口,但恰巧能夠處理兩種壓縮格式,但Zlib本身仍然只是用於放氣,而不是LZW。 –

回答

1

要解壓縮.Z文件,我只是用Delphi XE2內置的zlib庫:

uses ...,ZLib; 

procedure UnpackFiles; 
var 
    LList: TStringDynArray; 
    I: Integer; 
    FileName: String; 
    DestFileName: String; 
    LUnZip: TZDecompressionStream; 
    LInput, LOutput: TFileStream; 
begin 
    LList:= TDirectory.GetFiles(ImportDir, '*.gz'); 
    for i:= 0 to Length(LList)-1 do 
    begin 
    FileName:= LowerCase(LList[i]); 
    DestFileName:= ChangeFileExt(FileName, '.csv'); 
    { Create the Input, Output, and Decompressed streams. } 
    LInput := TFileStream.Create(FileName, fmOpenRead); 
    LOutput := TFileStream.Create(DestFileName, fmCreate); 
    LUnZip := TZDecompressionStream.Create(LInput, 15+16); // 16 = read as gzip header ! 

    Log(Format('create uncompressed file %s', [DestFileName])); 
    { Decompress data. } 
    LOutput.CopyFrom(LUnZip, 0); 

    { Free the streams. } 
    LUnZip.Free; 
    LInput.Free; 
    LOutput.Free; 
    Log(Format('Delete compressed file %s', [FileName])); 
    DeleteFile(FileName); 
    end; 
end; 

的重要組成部分,是設置讀取gzip頭的選項:

LUnZip := TZDecompressionStream.Create(LInput, 15+16); // 16 = read as gzip header ! 
+1

來自文檔:'windowBits對於可選的gzip解碼也可以大於15。將32添加到windowBits以啓用帶自動標題檢測的zlib和gzip解碼,或添加16以僅解碼gzip格式(zlib格式將返回Z_DATA_ERROR)。如果正在解碼gzip流,則strm-> adler是crc32而不是adler32。「 –

+0

? zlib不管理.Z(Unix壓縮)文件。 – philnext