TZipMaster VCL by Eric W. Engler. v1.20 A Delphi/C++ Builder wrapper for my freeware ZIP and UNZIP DLLs. A VCL wrapper for my freeware ZIP and UNZIP DLLs. At run time, the DLL's: ZIPDLL.DLL and UNZDLL.DLL must be present on the hard disk - in C:\WINDOWS\SYSTEM or else in your application directory, or a directory in the PATH. These DLLs are based on the InfoZip Official Freeware Zip/Unzip source code, but they are NOT equivalent to InfoZip's DLLs. I have modified the InfoZip source code to enhance their ease-of-use, power, and flexibility for use with Delphi and C++ Builder. Please do NOT contact InfoZip for issues regarding this port. To obtain the official InfoZip source code, consult their Web site: http://www.cdrom.com/pub/infozip/ The five main methods that can be invoked are: add - add one or more files to a ZIP archive delete - delete one or more files from ZIP archive extract - expand one or more files from a ZIP archive list - transfer "table of contents" of ZIP archive to a StringList copyfile - copies a file "add" and "list" will also work on self-extracting ZIP archives having a file extension of ".EXE". Various properties exist to control the actions of the methods. Filespecs are specified in the FSpecArgs TStringList property, so you can easily combine many different filespecs into one Add, Delete, or Extract operation. For example: 1. Add entries directly to the FSpecArgs property: ZipMaster1.FSpecArgs.Add('C:\AUTOEXEC.BAT'); ZipMaster1.FSpecArgs.Add('C:\DELPHI\BIN\DELPHI.EXE'); ZipMaster1.FSpecArgs.Add('C:\WINDOWS\*.INI'); 2. Take the filespecs from a StringList, just assign them all over to ZipMaster1. ZipMaster1.FSpecArgs.Assign(StringList1); 3. Take the filespecs from a ListBox, just assign them all over to ZipMaster1. ZipMaster1.FSpecArgs.Assign(ListBox1.Items); You can specify either the MS-DOS backslash path symbol, or the one normally used by PKZIP (the Unix path separator: /). They are treated exactly the same. All of your FSpecArgs accept MS-DOS wildcards. Add, Delete, and Extract are the only methods that use FSpecArgs. The List method doesn't - it just lists all files. Following is a list of all TZipMaster properties, events and methods: Properties ========== Verbose Boolean If True, ask for the maximum amount of "possibly important" information from the DLLs. The informational messages are delivered to your program via the OnMessage event, and the ErrCode and Message properties. This is primarily used to determine how much info you want to show your "end-users" - developers can use the Trace property to get additional infomation. Trace Boolean Similar to Verbose, except that this one is aimed at developers. It lets you trace the execution of the C code in the DLLs. Helps you locate possible bugs in the DLLs, and helps you understand why something is happening a certain way. ErrCode Integer Holds a copy of the last error code sent to your program by from DLL. 0=no error. See the OnMessage event. Most messages from the DLLs will have an ErrCode of 0. Message String Holds a copy of the last message sent to your program by the DLL. See the OnMessage event. ZipContents TList Read-only TList that contains the directory of the archive specified in the ZipFileName property. Every entry in the list points to a ZipDirEntry record. This is automatically filled with data whenever an assignment is made to ZipFileName, and can be manually filled by calling the List method. For your convenience, this VCL hides the TList memory allocation issues from you. Automatic updates to this list occur whenever this VCL changes the ZIP file. Event OnDirUpdate is triggered for you each time this list is updated - that is your queue to refresh your directory display. --------------------------------------------------------------------- Each entry in the ZipContents TList is a ZipDirEntry record: ZipDirEntry = packed Record Version : WORD; Flag : WORD; CompressionMethod : WORD; DateTime : Longint; { Time: Word; Date: Word; } CRC32 : Longint; CompressedSize : Longint; UncompressedSize : Longint; FileNameLength : WORD; ExtraFieldLength : WORD; FileName : String; end; To get compression ratio: (code from Almer Tigelaar, tigelaar@tref.nl) var ratio: Integer; begin with ZipDirEntry1 do ratio:=Round((1-(CompressedSize/UnCompressedSize))*100); --------------------------------------------------------------------- Cancel Boolean If you set this to True, it will abort any Add or Extract processing now underway. There may be a slight delay before the abort will take place. Note that a ZIP file can be corrupted if an Add operation is aborted. ZipBusy Boolean If True, a ZIP operation is underway - you must delay your next Add/Delete operation until this is False. You won't need to be concerned about this in most applications. This can be used to syncronize Zip operations in a multi-threaded program. UnzBusy Boolean If True, an UNZIP operation is underway - you must delay your next Extract operation until this is False. You won't need to be concerned about this in most applications. This can be used to syncronize UnZip operations in a multi-threaded program. AddCompLevel Integer Compression Level. Range 0 - 9, where 9 is the tightest compression. 2 or 3 is a good trade-off if you need more speed. Level 0 will just store files without compression. I recommend leaving this at 9 in most cases. AddOptions Set This property is used to modify the default action of the Add method. This is a SET of options. If you want an option to be True, you need to add it to the set. This is consistant with the way Delphi deals with "options" properties in general. AddDirNames If True, saves the pathname with each fname. Drive IDs are never stored in ZIP file directories. NOTE: the root directory name is never stored in a pathname; in other words, the first character of a pathname stored in the zip file's directory will never be a slash. AddForceDOS If True, force all filenames that go into the ZIP file to meet the DOS 8x3 restriction. If false, long filenames are supported. WARNING: name conflicts can occur if 2 long filenames reduce to the same 8x3 filename! AddZipTime If True, set ZIP timestamp to that of the newest file in the archive. AddRecurseDirs If True, subdirectories below EACH given fspec will be included in the fspec. Defaults to False. This is potentially dangerous if the user does this from the root directory (his hard drive may fill up with a huge zip file)! AddHiddenFiles If True, files with their Hidden or System attributes set will be included in the Add operation. NOTE: You can not have more than one of the following three options set to "True". If all three are False, then you get a standard "add": all files in the fspecs will be added to the archive regardless of their date/time stamp. This is also the default. AddMove If True, after adding to archive, delete orig file. Potentially dangerous. Use with caution! NOTE: Freshen and Update can only work on pre-existing archives. Update can add new files to the archive, but can't create a new archive. AddFreshen If True, add newer files to archive (only for files that are already in the archive). AddUpdate If True, add newer files to archive (but, any file in an fspec that isn't already in the archive will also be added). ExtrBaseDir String This base directory applies only to "Extract" operations. The UNZIP DLL will "CD" to this directory before extracting any files. If you don't specify a value for this property, then the directory of the ZipFile itself will be the base directory for extractions. ExtrOptions set This property is used to modify the default action of the Extract method. This is a SET of options. If you want an option to be True, you need to add it to the set. ExtrDirNames If True, extracts and recreates the relative pathname that may have been stored with each file. Empty dirs stored in the archive (if any) will also be recreated. ExtrOverWrite If True, overwrite any pre-existing files during Extraction. ExtrFreshen If True, extract newer files from archive (only for files that already exist). Won't extract any file that isn't already present. ExtrUpdate If True, extract newer files from archive (but, also extract files that don't already exist). FSpecArgs TStrings Stringlist containing all the filespecs used as arguments for Add, Delete, or Extract methods. Every entry can contain MS-DOS wildcards. If you give filenames without pathnames, or if you use relative pathnames with filenames, then the base drive/directory is assumed to be that of the Zipfile. ZipFileName String Pathname of a ZIP archive file. If the file doesn't already exist, you will only be able to use the Add method. I recommend using a fully qualified pathname in this property, unless your program can always ensure that a known directory will be the "current" directory. Count Integer Number of files now in the Zip file. Updated automatically, or manually via the List method. SuccessCnt Integer Number of files that were successfully operated on (within the current ZIP file). You can read this after every Add, Delete, and Extract operation. ZipVers Integer The version number of the ZIPDLL.DLL. For example, 110 = version 1.10. UnzVers Integer The version number of the UNZDLL.DLL. For example, 110 = version 1.10. Events ====== OnDirUpdate Occurs immed. after this VCL refreshes it's TZipContents TList. This is your queue to update the screen with the new contents. OnProgress Occurs during compression and decompression. Intended for "status bar" or "progress bar" updates. Criteria for this event: - starting to process a new file (gives you the filename and total uncompressed filesize) - every 32K bytes while processing - completed processing on a batch of files See Demo1 to learn how to use this event. OnMessage Occurs when the DLL sends your program a message. The Message argument passed by this event will contain the message. If an error code accompanies the message, it will be in the ErrCode argument. The Verbose and Trace properties have a direct influence on how many OnMessage events you'll get. See Also: Message and ErrCode properties. Methods ======= Add Adds all files specified in the FSpecArgs property into the archive specified by the ZipFileName property. Files that are already compressed will not be compressed again, but will be stored "as is" in the archive. This applies to .GIF, .ZIP, .LZH, etc. files. Note that .JPG files WILL be compressed, since they can still be squeezed down in size by a notable margin. Extract Extracts all files specified in the FSpecArgs property from the archive specified by the ZipFilename property. If you don't specify any FSpecArgs, then all files will be extracted. Delete Deletes all files specified in the FSpecArgs property from the archive specified by the ZipFilename property. List Refreshes the contents of the archive into the ZipContents TList property. This is a manual "refresh" of the "Table of Contents". CopyFile This copies any file to any other file. Useful in many application programs, so it was included here as a method. This returns 0 on success, or else one of these errors: -1 error in open of outfile -2 read or write error during copy -3 error in open of infile -4 error setting date/time of outfile Can be used to make a backup copy of the ZipFile before an Add operation. Sample Usage: with ZipMaster1 do begin ret=CopyFile(ZipFileName, 'C:\TMP$$.ZIP'); if ret < 0 then ShowMessage('Error making backup'); end; IMPORTANT note regarding CopyFile: The destination must include a filename (you can't copy fname.txt to C:\). Also, Wildcards are not allowed in either source or dest. -------------------------------------------------------------------- DLL Loading and Unloading This table show you which DLL is needed for each method: Add requires ZIPDLL.DLL Delete requires ZIPDLL.DLL Extract requires UNZDLL.DLL List none (internal code in this VCL) CopyFile none (internal code in this VCL) The following 4 methods give you explicit control over loading and unloading of the DLLs. For simplicity, you can do the loads in your form's OnCreate event handler, and do the unloads in your form's OnDestroy event handler. Load_Zip_Dll -- Loads ZIPDLL.DLL, if not already loaded Load_Unz_Dll -- Loads UNZDLL.DLL, if not already loaded Unload_Zip_Dll -- Unloads ZIPDLL.DLL Unload_Unz_Dll -- Unloads UNZDLL.DLL For compatibility with older programs, and because I'm a nice guy, I'll handle the loads and unloads automatically if your program doesn't do it. This can, however, incur a perfomance penalty because it will reload the needed DLL for each operation. Advanced developers will want to carefully consider their load and unload strategy so they minimize the number of loads, and keep the DLLs out of memory when they're not needed. There is a traditional speed vs. memory trade-off.