* Azip procedure to zip files for Visual FoxPro using the
* AddZip AZIP32.DLL from shareware
* [url]http://ourworld.compuserve.com/homepages/Stephen_Darlington/addzip.htm[/url]
* Requirements: AZIP32.DLL in your Windows\system directory or current directory
*
* USAGE: AZIP(lInitialize, sArchive, sInclFiles[, ZipParams])
*
* Example: AZIP(.T., "ZIPFILE", "*.DBF *.TXT Customer.doc -FoxUser.*")
*
* DO NOT USE '|' AS FILE NAME SEPARATORS - USE ONLY SPACES ' '
*
* PARAMETERS:
*-- lInitialize: .T. first time & Done only once before or when starting file zip - .F. afterward
*- Calling azip() with no params also initializes
*-- sArchive: Archive FileName with extension - Example "C:\THISFILE.ZIP"
*-- sInclFiles: String repr. file(s) to include, but excludes files with '-' in front.
*-- Example1 "D:\CUSTDATA.DBF"
*-- Example2 "C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*" - only single spaces in between
*-- ZIPparams: Some compression parameters [Optional]
* e(x) x = 'X' maximum compression
* x = '0' no compression (digital 0 not O)
* x = 'S' minimal compression
* x = 'N' normal compression (default)
* P include directory entries
* & Span disks
* Spassword must be last part
*
* Return Values: the number of files archived or -1 if archive name not specified.
PARAMETERS lInitialize, sArchive, sInclFiles, ZIPparams
PRIVATE Params, sTemp
Params = PARAMETERS()
* declare needed DLL functions & pass current window
IF Params = 0 OR lInitialize
PRIVATE HWND
DECLARE INTEGER GetActiveWindow IN win32api
HWND = GetActiveWindow()
DECLARE addZIP_Initialise IN AZIP32
DECLARE SHORT addZIP_SetParentWindowHandle IN AZIP32 SHORT HWindow
DECLARE SHORT addZIP_ArchiveName IN AZIP32 STRING @ sArchName
DECLARE SHORT addZIP_Include IN AZIP32 STRING @ sFileName
DECLARE SHORT addZIP_Exclude IN AZIP32 STRING @ seFileName
DECLARE SHORT addZIP_Recurse IN AZIP32 SHORT nRecurse
DECLARE SHORT addZIP_SetCompressionLevel IN AZIP32 SHORT nComprLvl
DECLARE SHORT addZIP_IncludeDirectoryEntries IN AZIP32 SHORT nInclDir
DECLARE SHORT addZIP_IncludeEmptyDirectoryEntries IN AZIP32 SHORT nInclEDir
DECLARE SHORT addZIP_Update IN AZIP32 SHORT nUpdate
DECLARE SHORT addZIP_Span IN AZIP32 SHORT nSpan
DECLARE INTEGER addZIP IN AZIP32
DECLARE SHORT addZIP_Register IN AZIP32 STRING @ RegName, LONG RegNum
DECLARE SHORT addZIP_Encrypt IN AZIP32 STRING @ sPassw
addZIP_Initialise()
addZIP_SetParentWindowHandle(HWND)
*addZIP_Register("UBS, INC.", 600365060)
addZIP_Register("UBS, INC.", 0x23C8D804)
* Do above line if you have registered the software - it permits passwords
IF Params < 2
RETURN 0
ENDIF
ENDIF
IF Params < 3
?? CHR(7)
MESSAGEBOX('Missing parameters!',0, 'AZip Notice!')
RETURN 0
ENDIF
IF Params > 3 AND !EMPTY(ZIPparams) && ZIPparams exist
ZIPparams = ALLT(ZIPparams)
PRIVATE LastPos, PASSWORD, nCurPos
LastPos = LEN(ZIPparams) + 1
* check for password
nCurPos = ATC('S', ZIPparams)
IF nCurPos > 0
cPassWord = SUBSTR(ZIPparams, nCurPos+1)
addZIP_Encrypt(cPassWord)
ZIPparams = LEFT(ZIPparams, nCurPos -1) && now remove password part - it may have other code
ENDIF
* check for storing subdirectory information
nCurPos = ATC('P', ZIPparams)
IF nCurPos > 0
addZIP_Recurse(1)
* addZIP_IncludeDirectoryEntries(1)
* addZIP_IncludeEmptyDirectoryEntries(1)
ELSE
addZIP_Recurse(0)
* addZIP_IncludeDirectoryEntries(0)
ENDIF
* check for disk span
nCurPos = ATC('&', ZIPparams)
IF nCurPos > 0
*addZIP_SpanSizes(0, 0)
addZIP_Span(1)
ENDIF
* check for compresion level
nCurPos = ATC('E', ZIPparams)
IF nCurPos > 0
PRIVATE cCompLevel, nCompLevel
cCompLevel = SUBSTR(ZIPparams, nCurPos + 1, 1)
DO CASE
CASE cCompLevel = 'X' && max compression
nCompLevel = 3
CASE cCompLevel = 'S' && min compression
nCompLevel = 1
CASE cCompLevel = '0' && no compression
nCompLevel = 0
OTHERWISE && normal/default compression
nCompLevel = 2
ENDCASE
addZIP_SetCompressionLevel(nCompLevel)
ENDIF
ELSE
addZIP_SetCompressionLevel(2)
ENDIF
addZIP_ArchiveName(sArchive) && specify archive filepath
* separate include and exclude files
sInclFiles = ALLT(STRTRAN(sInclFiles, ' ', ' '))&& remove triple spaces
sInclFiles = ALLT(STRTRAN(sInclFiles, ' ', ' '))&& remove double spaces
TempS = ' ' + ALLT(sInclFiles) + ' '
sInclFiles = ''
sExclFiles = ''
WordCount = OCCURS(' ', TempS) - 1
FOR i = 1 TO WordCount
TempS2 = SUBSTR(TempS, AT(' ', TempS, i) + 1, AT(' ', TempS, i + 1) - AT(' ', TempS, i) - 1)
IF LEFT(TempS2, 1) = '-' && exclude file
sExclFiles = sExclFiles + SUBSTR(TempS2, 2) + '|'
ELSE && include file
sInclFiles = sInclFiles + TempS2 + '|'
ENDIF
ENDFOR
sInclFiles = IIF(RIGHT(sInclFiles, 1) = '|', LEFT(sInclFiles, LEN(sInclFiles) -1 ), sInclFiles)
addZIP_Include(sInclFiles) && (sInclFiles)
IF !EMPTY(sExclFiles)
sExclFiles = IIF(RIGHT(sExclFiles, 1) = '|', LEFT(sExclFiles, LEN(sExclFiles) -1 ), sExclFiles)
addZIP_Exclude(sExclFiles)
ENDIF
RETURN addZIP() && do it & return # of files compressed
DECLARE addZIP_Initialise IN AZIP32
DECLARE SHORT addZIP_SetParentWindowHandle IN AZIP32 SHORT @ HWindow
DECLARE SHORT addZIP_ArchiveName IN AZIP32 STRING @ sArchName
DECLARE SHORT addZIP_Include IN AZIP32 STRING @ sFileName
DECLARE SHORT addZIP_Exclude IN AZIP32 STRING @ seFileName
DECLARE SHORT addZIP_Recurse IN AZIP32 SHORT @ nRecurse
DECLARE SHORT addZIP_SetCompressionLevel IN AZIP32 SHORT @ nComprLvl
DECLARE SHORT addZIP_IncludeDirectoryEntries IN AZIP32 SHORT @ nInclDir
DECLARE SHORT addZIP_IncludeEmptyDirectoryEntries IN AZIP32 SHORT @ nInclEDir
DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
* DECLARE SHORT addZIP_SpanSizes IN AZIP32 LONG @ ulFirst, LONG @ ulOther
DECLARE SHORT addZIP_Span IN AZIP32 SHORT @ nSpan
DECLARE SHORT addZIP IN AZIP32
DECLARE SHORT addZIP_Register IN AZIP32 STRING @ RegName, LONG @ RegNum
DECLARE SHORT addZIP_Encrypt IN AZIP32 STRING @ sPassw