BIX je WIN32 konzolová aplikace pro kompresi a dekompresi souborů. Dokáže komprimovat obsah adresáře včetně podadresářů.
#INCLUDE "Main.h"
*************************************************************
* Procedura, která vrátí objekt pro pakování a rozpakování
*************************************************************
PROCEDURE GetInterface(loObj)
*@loObj - Vlastnost do které se zapíše odkaz na objekt pro pakování
loObj=CREATEOBJECT("_bix_Archiver")
*************************************************************
* Vlastní třída pro pakování a rozpakování
*************************************************************
DEFINE CLASS _bix_Archiver AS Custom
Name="_bix_Archiver"
* Dekompresní metoda
PROCEDURE Decompress(loPack)
* loPack - Objekt pro rozpakování
LOCAL lcDir,lcProgram,lctmpFile,lcUnpackPath,liz,lcStartupInfo,lcProcessInfo,liRet
LOCAL ARRAY laDir(1)
lctmpFile=loPack.File_S && Převezmi název zdrojového souboru
lcDir=ExtractPathFromFile(lctmpFile) + CHR(0)
lcUnpackPath=GetTempPathEx()+SYS(2015)+"\" && Název pomocného adresáře
=MKD(lcUnpackPath) && Vytvoř pomocný adresář
* Vytvoř C++ strukturu z VFP objektu
lcStartupInfo=loPack.SI.CreateString()
lcProcessInfo=loPack.PI.CreateString()
lcProgram = loPack.PU.D_File+" e "+lctmpFile+" -o"+lcUnpackPath+" -y" + CHR(0)
=SetLastError(0) && Resetuj chybu pro vlákno
liRet=_PP_ProcessFailed
IF CreateProcess(.NULL., lcProgram, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, @lcDir, @lcStartupInfo, @lcProcessInfo)#0
* Výborně neselhalo to
loPack.PI.ReadString(@lcProcessInfo) && Načti informace o spuštěném procesu.
* Nyní běhej ve smyčce tak dlouho, dokud proces běží
DO WHILE WaitForSingleObject(loPack.PI.hProcess, 250 ) = WAIT_TIMEOUT
ENDDO
=CloseHandle(loPack.PI.hProcess) && Uzavři handle
liz=ADIR(laDir,lcUnpackPath+"*.*","ASRH") && Načti všechny soubory
liRet=IIF(liz=0,_PP_PAUNFailed,;
IIF(MoveFile((lcUnpackPath+laDir(1,1)+CHR(0)),(loPack.File_D+CHR(0)))=1,_PP_ErrOK,_PP_PAUNFailed))
ENDIF
=RemoveDirectoryAll(lcUnpackPath) && Zlikviduj pracovní cestu
RETURN liRet
ENDPROC
* Kompresní metoda
PROCEDURE Compress(loPack)
* loPack - Objekt pro zpakování
LOCAL lcDir,lcProgram,lcStartupInfo,lcProcessInfo,liRet,liExitCode
lcDir=ExtractPathFromFile(loPack.File_S) + CHR(0) && Zjisti adresář, ve kterém se soubor nachází.
lcProgram = loPack.PU.C_File+" a "+loPack.File_D+" "+ExtractFileFromFile(loPack.File_S) + CHR(0)
* Vytvoř C++ strukturu z VFP objektu
lcStartupInfo=loPack.SI.CreateString()
lcProcessInfo=loPack.PI.CreateString()
=SetLastError(0)&& Resetuj chybu pro vlákno
liRet=_PP_ProcessFailed
IF CreateProcess(.NULL., lcProgram, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, @lcDir, @lcStartupInfo, @lcProcessInfo)#0
* Výborně neselhalo to
loPack.PI.ReadString(@lcProcessInfo) && Načti informace o spuštěném procesu.
* Nyní běhej ve smyčce tak dlouho, dokud proces běží
liExitCode=STILL_ACTIVE
DO WHILE liExitCode=STILL_ACTIVE
=Sleep(500) && Počkej půl vteřiny
=GetExitCodeProcess(loPack.PI.hProcess,@liExitCode ) && Zjisti návratový hodnotu z procesu
ENDDO
=CloseHandle(loPack.PI.hProcess) && Uzavři handle
liRet=_PP_ErrOK
ENDIF
RETURN liRet
ENDPROC
ENDDEFIN