PROGRAM INCLUDE('equates.clw'),ONCE INCLUDE('tplequ.clw'),ONCE INCLUDE('keycodes.clw'),ONCE INCLUDE('errors.clw'),ONCE INCLUDE('prnprop.clw'),ONCE GENERIC_READ EQUATE(80000000H) GENERIC_WRITE EQUATE(40000000H) CREATE_ALWAYS EQUATE(2) OPEN_EXISTING EQUATE(3) FILE_ATTRIBUTE_NORMAL EQUATE(00000080H) MAP MODULE('Windows') CreateFileA(*LPCSTR,DWORD,DWORD,*SECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE),HANDLE,PASCAL,RAW CloseHandle(HANDLE),BOOL,PASCAL ! WriteFile(HANDLE, ULONG, ULONG, ULONG, ULONG),BOOL,PASCAL,RAW _lwrite(HFILE,ULONG,UNSIGNED),UNSIGNED,PASCAL,RAW END MODULE('zlib1.lib') ! Muss mit libmaker.exe hergestellt werden zlibVersion,CSTRING,C,RAW gzopen(*CSTRING path, *CSTRING mode),ULONG,C,RAW gzread(ULONG, ULONG, unsigned),ULONG,C,RAW gzwrite(ULONG, ULONG, unsigned ),ULONG,C,RAW gzclose(ULONG),ULONG,C,RAW END INCLUDE('e:\c55allg\slo_allg.inc') INCLUDE('e:\c55allg\slo_wndf.inc') SLO_ZipFile(STRING cSourceFileName,STRING cTargetFileName,BYTE IsCompress) END CODE RETURN !---------------------------------------------------------------------------------------------- SLO_ZipFile PROCEDURE(STRING cSourceFileName,STRING cTargetFileName,BYTE IsCompress) C_BUFSIZE EQUATE(32768) Loc::csInFile CSTRING(255) Loc::csInMode CSTRING(255) Loc::csOutFile CSTRING(255) Loc::csOutMode CSTRING(255) Loc::csSource BYTE,DIM(C_BUFSIZE) Loc::ulLibOutRet ULONG Loc::ulLibInRet ULONG Loc::ulgzFileIn ULONG Loc::ulgzFileOut ULONG Loc::ulCount UNSIGNED Loc::usVar USHORT Loc::cUnzipVar CSTRING(C_BUFSIZE + 1) Loc::hfile SHORT Loc::hHandle HANDLE(0) MySECURITY_ATTRIBUTES GROUP(SECURITY_ATTRIBUTES),PRE() END MyOVERLAPPED GROUP(OVERLAPPED) END CODE Loc::csInFile = CLIP(cSourceFileName) Loc::csInMode = 'rb' Loc::ulgzFileIn = gzopen(Loc::csInFile,Loc::csInMode) IF IsCompress Loc::csOutFile = CLIP(cTargetFileName) & '.gz' ELSE Loc::csOutFile = cTargetFileName[1 : INSTRING('.gz',cTargetFileName,1,1) - 1] CLEAR(MySECURITY_ATTRIBUTES,0) MySECURITY_ATTRIBUTES:nLength = SIZE(MySECURITY_ATTRIBUTES) Loc::hfile = CreateFileA(Loc::csOutFile,| GENERIC_READ + GENERIC_WRITE,| 0,| MySECURITY_ATTRIBUTES,| CREATE_ALWAYS,| FILE_ATTRIBUTE_NORMAL,| Loc::hHandle) IF Loc::hfile < 0 MESSAGE('Zieldatei kann nicht angelegt werden !') RETURN END END IF IsCompress Loc::csOutMode = 'wb9' Loc::ulgzFileOut = gzopen(Loc::csOutFile,Loc::csOutMode) END LOOP Loc::ulLibInRet = gzread(Loc::ulgzFileIn,ADDRESS(Loc::csSource),C_BUFSIZE) IF Loc::ulLibInRet = 0 BREAK END IF IsCompress Loc::ulLibOutRet = gzwrite(Loc::ulgzFileOut,ADDRESS(Loc::csSource),Loc::ulLibInRet) ELSE Loc::cUnzipVar = '' LOOP Loc::usVar = 1 TO Loc::ulLibInRet Loc::cUnzipVar[Loc::usVar] = CHR(Loc::csSource[Loc::usVar]) END !- jetzt sollte eigentlich "WriteFile" folgen. !- Diese API-Funktion macht allerdings Probleme bei Dateien mit den Attributen "OWNER(),ENCRYPT" !- Deshalb benutzen wir die ältere Funktion "_lwrite". Die funktioniert prima. !- Wenn uns hier jemand einen Tipp geben kann wären wir sehr dankbar. Loc::ulLibOutRet = _lwrite(Loc::hfile,ADDRESS(Loc::cUnzipVar),Loc::ulLibInRet) END END IF gzclose(Loc::ulgzFileIn). IF IsCompress IF gzclose(Loc::ulgzFileOut). ELSE IF Loc::hfile >= 0 IF CloseHandle(Loc::hfile). END END RETURN