News about ZipTV
Home page of ZipTV for C++Builder Visit the Bitberry Software main site
Home Prices Features Download History Customer Portal Support About

ZipTV version history

---------------------------------------------------------------------------
Revision History
---------------------------------------------------------------------------

2009.1.1 Revision(s)

1. Beta version. Original release of ZipTV for Delphi 2009 with native
   unicode support.  

   Thousands of archives have been tested and revisions included when
   appropriate. ZipTV for Delphi 2009 is not backward compatible with any
   prior versions of Delphi; however, we plan on continuing upgrades and
   support for those versions as well. Even though prior versions of ZipTV
   included support for unicode (via a conversion layer provided by the use of
   a 3rd party unicode package), we strongly recommend ZipTV for Delphi 2009
   for unicode support.

2008.12.13 Revision(s)

1. Included support for the proper reading and extraction of unicode
   filenames stored in zip files that use extended headers as a method 
   of providing support for unicode filenames. Utility applications that 
   use this method, first write the ansi-string form of the filename to 
   the header, UTF8 encode it, and then write the UTF8 encoded string 
   value to an extended header. This method results in the writing of 
   one filename to a zip file four times. 

   There are many problems with this method. The first is the writing of 
   a filename four times as previously mentioned. With that in mind, if 
   it is determined that UTF8 encoding is required, reconstruction of the 
   stored ansi-string value is generally not possible anyway, so what is 
   the purpose of writing it to the archive?  Another is that most utility 
   applications compressing files using this method, bypass the ansi-string 
   stored value and instead, read the UTF8 encoded string from the extended 
   header, providing no access to the stored ansi-string value - again, 
   what's the purpose of writing the filename four times?  The zip format is 
   the only archive format that supports extended headers; therefore, 
   uniformity of unicode filename support across all supported archive formats 
   cannot be achieved. 

   The zip format contains three header types. The local header, central
   header, and ending header. Filenames have always been written to a zip
   archive, two times. Once in the local header and once in the central header.
   With the use of an extended header to support unicode, one filename is
   written to the archive four times, twice in the local header and twice in
   the central header. Consider an archive containing a thousand compressed
   files, a single filename has the capacity to hold up to 256 single byte
   characters, and each filename stored four times. 

   There are three points here. Consideration for unicode in archives exists
   only in the archive's compressed filenames. Compression algorithms remain
   heavily byte oriented, so the compressed data will always be reconstructed
   back to it's exact original decompressed state. Storing the ansi-string
   version of the filename is wasted space because when an extended header flag
   signals a UTF8 encoded filename, the stored ansi-string version of the
   filename is bypassed, and the UTF8 encoded string value is used. Therefore,
   if our default UTF8 encoding method fails, so will the method of using
   extended headers. Second, the use of UTF8 encoding of filenames as the
   default in ZipTV, is universal in all archive formats supported. Only zip
   headers support extended headers; therefore, the method of supporting
   unicode with the use of extended headers is possible only in zip files.
   Third, the practice of bloating headers with junk data is reversing the
   small gains that's been achieved over the years in compression ratios. 

   Not to imply it is not possible, but we have yet to test an archive
   containing UTF8 encoded filenames that fails decoding and proper
   reconstruction, even in double byte character set languages such as Arabic.
   Unless we are provided with an instance where UTF8 encoded filenames in an
   archive fails decoding, we favor UTF8 encoding as the default method for
   writing filenames to all archive formats.  ZipTV can properly read and
   extract unicode filenames from a zip file compressed using extended 
   headers; however, we currently have no plans to pattern this method in 
   compressing new files to a zip file.  Other utility applications wishing 
   to support default UTF8 encoded filenames, can simply test the stored 
   filename to see if it is UTF8 encoded.

   Barriers in international communications are rapidly narrowing, and issues
   regarding character translations between languages are lessening. Even
   though great progress has been made over the past few years, it is not a
   perfected science yet, especially with regard to signal to double byte
   characters and reverse.  We do not in any way, purport ourselves to be
   experts on the subject of unicode, nor do we mean to imply that others are
   wrong in their use of extended headers for unicode support.  Only that we
   will not unquestionably pattern our development to follow the lead of others
   who have not proven a comparable level of understanding and uniformity in
   their development regarding unicode issues, as the Delphi folks have in
   their recent release of Delphi 2009. 

   We have listed our finding and reasoning for not agreeing with the use of
   extended headers to support unicode filenames in zip files. As always,
   opposing views are always welcome.

2. TUnGZip: this issue involved a gzip compressed tarball (.tar.gz), when 
   both the .gz file as well as the compressed .tar file contained stored
   paths.  

   Archive name: distributor tar.gz

   Properties: 
      UseStoredDirs property := true;
      ExtractDir := 'c:\test';

   a. Distributor.tar.gz contains one compressed file: 
      data01\eserverdata\contentitems\19\61\test.tar

   b. data01\eserverdata\contentitems\19\61\test.tar has two files:
      NRC\ NRC Handelsblad - Maandag 8 december.pdf
      System\Inbox\test.001.desktop

   When the UseStoredDirs property was true, the two files in test.tar were
   extracted as:

   1. c:\test\data01\eserverdata\contentitems\19\61\ NRC\ NRC Handelsblad - Maandag 8 december.pdf
   2. c:\test\data01\eserverdata\contentitems\19\61\System\Inbox\test.001.desktop

   Note the above extracted directory's combination of the values of the
   ExtractDir property (c:\test), the pathname stored in the gzip archive
   (data01\eserverdata\contentitems\19\61\), and the pathname stored in the tar
   files (NRC\  and  System\Inbox\).

   Considering the property settings shown above, the correct files should be
   extracted as:
   1. c:\test\NRC\ NRC Handelsblad - Maandag 8 december.pdf
   2. c:\test\System\Inbox\test.001.desktop

2008.9.29 Revision(s)

1. All compression components: adding files to an archive on a thumb-drive
   were being handled using the objects for removable floppy drives.  Fixed.

2008.8.4 Revision(s)

1. Maintenance update

2. TUnRar: A multi-volume stores an additional header at beginning offset 0
   in every subsequent volume that spans a specific compressed file.  
   Previous versions returned the values from the first header. Values are 
   now obtained from a compressed file's last volume's header. Encrypted 
   headers are now supported.

3. FileInArchive: bug fix.

2008.4.21 Revision(s)

1. Added support for the FILE_ATTRIBUTE_REPARSE_POINT (1024) attribute:
   http://msdn2.microsoft.com/en-us/library/aa365740(VS.85).aspx.  This
   attribute is now excluded from directory scanning when the RecurseDirs
   property equals true (see the following conversation thread):

   There are many reparse points (not dirs, just pointers/links to other 
   dirs) in Vista.  The problem is, that Scan and ScanDir procedures repute 
   these links as normal dirs. This is not correct. For better understanding,
   compress "C:\Users\MyDir" (with RecurseDirs := True) in Vista without
   skipping reparse points, then open the archive and look at the content.

2008.4.20 Revision(s)

1. Unable to add/delete files from an archive with filenames containing
   umlaut characters.  Fixed.

2. WideString version of ZipTV & OEM encoded filenames:  ZipTV was able 
   to manage (create/add/delete) OEM encoded files to/from an archive 
   created by other utilities, but some other utilities were unable read 
   the revised archive since the filenames were stored in widestring format.  
   Revised for compatibility.

2008.2.16 Revision(s)

1. TArchiveStream bug was recently introduced in this object.  Fixed.

2008.1.21 Revision(s)

1. New component: TZipEncrypt. Flexability and highly configurability, 
   archive password management system for use with existing archives. 
   This originaly release supports Zip archives.

   First and only component of it's kind. TZipEncrypt allows adding new, 
   changing existing, or assigning multiple passwords to individule or 
   defined range of compressed files.

   No longer are you confined to only one password for all compressed 
   files in a Zip archive. Assign one password to a certain file, file 
   type, directory, or range of files and protect other files, allowing 
   access to only certain individules or groups.

   * available as beta in registered versions. We strongly encourage 
     feedback and recomendations for enhancements of this component.

2007.9.24 Revision(s)

1. TUnBh: Buffer overflow when filename length is greater than 32k.  Fixed.

2007.6.26 Revision(s)

1. Unable to delete a .zip's main archive comment.  Fixed.

2007.5.29 Revision(s)

1. TZipRun & TZipSearch: added BZip support for utility/tool components.

2007.5.7 Revision(s)

1. TZip/TUnzip: this format can now contain more than 65536 files.

2007.3.12 Revision(s)

1. TUnGzip: bug fix: when a compressed filename matched the archive name 
   (with the exception of the .gz extension), the file opened for 
   decompressed data retained the .gz extension.  Since most .gz utilities 
   do not store the output filename within the archive, this affected only 
   a select number of archives. 

2007.3.8 Revision(s)

1. Compress components: added OnCreateDirectory event.  In prior versions,
   if the directory defined in the ArchiveFile property did not exist, 
   the archive was created in the current active directory.   By default, 
   the directory defined in this property is now created if it doesn't 
   exist. To prevent the creation of the directory, set an OnCreateDirectory 
   event.  

2007.2.26 Revision(s)

1. TZipTV & TUnLha: when using WideStrings (compiling with TNT_UNICODE 
   conditional define), .lha/lzh archives containing directories were 
   decoded properly.  This bug appears only when compiling using 
   WideStrings. Corrected.

2007.1.31 Revision(s)

1. Resolves of all known permissions issues under Windows Vista.

2006.11.1 Revision(s)

1. TztvFindFile: wasn't returning file found results when the conditional 
   define TNT_UNICODE wasn't used.  Fixed.

2. Revisit of Windows Vista permissions issue.  If you come across any 
   drive or directory permissions issues, please report them and we'll 
   make the correction and send the revision to you via email.  Any 
   permissions failures should route a E_PERMISSIONS error code (see 
   err_msgs.rc and err_msgs.pas) to the OnError event handler.

2006.10.26 Revision(s)

1. TZipSplitGlue: wasn't recognizing archives of type atZipMV.

2. Attempting to create an archive to a directory where user does not have 
   permission rights now handled correctly.

3. Compressors: storing empty directory names to an archive were failing 
   when the Windows Indexing Service was turned off.  

2006.10.1 Revision(s)

1. IMPORTANT installation and distribution notes: (please read carefully): 
   a. two dll filenames have changed: TUnAce requires ztvUnace26.dll and 
      TUnRar requires ztvUnRar36.dll.  You will have to make the necessary 
      revisions to your distributable application to reflect the correct 
      support files.
   b. The following mentioned unicode support requires the source code 
      version, since the code needs to be recompiled using the TNT_UNICODE 
      conditional define to include widechar support.
   c. UNICODE VERSION: ALL projects require a conditional define: 
      "TNT_UNICODE" (without the quotes).  This includes all demos included 
      in the package for unicode / dbcs support.  Unicode support is optional.     
   d. Installation of this package requires a 3rd party component package 
      (freeware)...the Tnt Unicode Controls (version 2.2.8).  It can be 
      downloaded from the following location: 
      http://www.tntware.com/delphicontrols/unicode/.  
      ** Unicode support is optional **

2. Source version only: all directory and filename strings have been converted 
   to WideStrings for support of DBCS and other languages not displayable under 
   various codepages. In ZipTV with unicode, these strings can be monitored 
   using unicode compatible functions. Languages tested include Russian, 
   Russian Cyrillic, Chinese, Japanese, Thai, Arabic (right to left ordering), 
   Czech, Danish, French, Korean, and Greek. 

3. Unicode and DBCS support requires Delphi 6+. The Win95, Win98, and WinME 
   operating systems require the Microsoft Layer for Unicode. For further 
   information about the MSLU see: 
   http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx.

4. Tested and verified compatibility with Japanese versions of Windows. 

5. In this version, we've gone back to the drawing board. We tested and 
   retested thousands of archives, updating many algorithms to correct 
   any inconsistencies that may have been introduced over a period of 
   years through simple revisions and the introduction of new components 
   to the suite. 

6. Security update patch. For further information see: 
   http://www.securityfocus.com/bid/19884/references

2006.1.26 Revision(s)

1. TArchiveStream: this revision deals with the .cab and .rar formats.  
   Their respective dll api's require their functions open the archive 
   from disk.  This requirement prevents sending the decompress components  
   for these types an untyped stream as an archive.  We included a 
   workaround for these archives which flushes the untyped stream to a 
   temporary file in the (windows temp dir) and using this temp file as 
   the input stream.

2006.1.16 Revision(s)

1. TZipRun upgraded. Click here for more details.

2. TZipTV: after adding AES encryption to the .bh (TBlakHole) compression, 
   TZipTV was returning "Unsupported" compression algorithm.  This did not 
   affect compression or decompression of .bh files.

2006.1 Revision(s)

1. Included support for C++ Builder 2006.

2005.6.4 Revision(s)

1. TUnCab (sfx's): installed routine to revise the offset of the compressed 
   data for sfx archives.

2005.6.3 Revision(s)

1. New component: TZipTV_Stream.  Similar to the TZipTV component for reading 
   an archive's contents, but different in that an archive contents is saved 
   to a stream.  Several methods have been included for reading the contents 
   stream.
 
2005.5.6.1 Revision(s)
 
1. TBlakHole & TUnBh: included support for the BZip2 compression algorithm.
 
2005.5.0 Revision(s) 

1. New components: TTarGZ and TTarBZ. Compressors components that first create
   .tar archive, then compress the resulting archive into a .tgz or .tbz 
   archive. A .tgz archive can be decompressed using the TUnGZip and TUnTar 
   components. A .tbz archive can be decompressed using the TUnBZip and TUnTar 
   components.
 
2005.4.0 Revision(s)

1. Maintenance release

2005.3.0 Revision(s) 

1. TZipTV: OnRead event: Offset parameter changed from type Integer to Int64 
   in support of files > 4 gig.

2. TZipSplitter & TArchiveSplitter. Completed support for archives larger
   than 4 GB
 
2005.2.1 Revision(s) 

1. Maintenance release
  
2005.2.0 Revision(s)

1. New component (beta): TArchiveStream. Unit(s): ztvArchiveStream.pas. The 
   operation of TArchiveStream is to decompress files within an Archive 
   irregardless of the origin of the stream or it's type.
 
   Since there are many development implications with this component 
   (internet/intranet streaming, port streaming, raw decompressed data handling 
   (data searches, virus scanning, etc) supporting multiple archive types, 
   we've developed this component with close adherence to the KISS principle, 
   thus providing the functionality with maximum flexibility.

2005.1.0 Revision(s)

1. TBZip & TUnBZip components added to component suite.

2. TZipSplitter, TZip, TUnZip: files can now be compressed to .zip files 
   using the BZip2 compression algorithm. 

2005.0.2 Revision(s)

1. Added support for Delphi 2005.

2. TZipTV & TUnTar: Included support for tar filenames greater than 
   the header limitation of 100 chars.
   
3. Filenames for the 3 dll's that we support have changed.  The new dll's 
   names now start with 'ztv'. ztvunrar3.dll, ztvcabinet.dll, ztvunace2.dll.

7.4 Revision(s)

1. Added support for a WinXP limited user account. When attempting to extract 
   to a directory the user does not have permissions for, a new OnLimitedUser
   event is activated. This event passes both the name of the protected 
   directory and the users directory. Users directories are located off 
   "documents and settings" and are generally the only directory that holds 
   write protections for these user accounts. 

7.3 Revision(s)

(beta due to ZipV2 encryption SeedKeys). Beta additions subject to change 
without prior notice.

1. WinZip "v9 final" bug:  in multiple disk spanned archives, the PackedSize 
   variable field is not assigned a value in the LocalHeader of each 
   compressed file that spans two or more diskettes.  We've included a 
   workaround for this bug, but will not include workarounds for bugs found 
   in their application in the future.

7.2 Revision(s)

1. ZipV2 (zip version 2+) encryption now supports the revision of the three 
   previously constant seed-keys.  These three keys have been hard coded in 
   every application supporting zip password encryption for decades, 
   leaving encrypted files vulnerable to the brute force hack attack.  
   Revising the value of these keys make the original zip encryption the 
   absolute most secure method of protecting compressed archives with a 
   password (even the new AES algorithm is vulnerable to the brute force attack).

2. Decompressors -> "OnGetPassword" event change: 

   Old:
      TOnGetPassword =
         Procedure(Sender: TObject; FileName: AnsiString; Var Password: AnsiString; 
		           Var TryAgain: Boolean) Of Object;

   New:
      TOnGetPassword =
         Procedure(Sender: TObject; FileName: AnsiString; Var Password: AnsiString; 
         Var HeaderKeys, DataKeys: TSeedKeyValues; Var TryAgain: Boolean) Of Object;

3. New properties:

   a. SeedHeaderKeys (TZip, TJar, TBlakHole, TZipSplitter, TZipTV, TUnZip, TUnJar, 
         TUnBh TZipSearch TZipCheck, TZipRun components)
   b. SeedDataKeys (TZip, TJar, TBlakHole, TUnZip, TUnJar, TUnBh, TZipSearch, 
         TZipCheck, TZipRun)
 
   Both properties are of type TSeedKeys (defined in ztvCrypt.pas - requires source 
   version to see).  

   Type
      TSeedKeyType = (skDataKeys, skHeaderKeys);

      TSeedKeys = Class(TPersistent)
      Private
         SeedKeyType: TSeedKeyType;
         Function GetKeyValue(x: Integer): Cardinal;
         Function GetDefaultKeyValue(x: Integer): Cardinal;
         Procedure SetKeyValue(x: Integer; Value: Cardinal);
      Protected
      Public
         Constructor Create(sk: TSeedKeyType); Virtual;
         Procedure SetKeys(k0, k1, k2: String); Overload;
         Procedure SetKeys(k0, k1, k2: Cardinal); Overload;
         Procedure SetDefaultKeys;
         Property GetDefaultKey[x: Integer]: Cardinal Read GetDefaultKeyValue;
         Property Key[x: Integer]: Cardinal Read GetKeyValue Write SetKeyValue;
      Published
         Property Key0: Cardinal Index 0 Read GetKeyValue Write SetKeyValue;
         Property Key1: Cardinal Index 1 Read GetKeyValue Write SetKeyValue;
         Property Key2: Cardinal Index 2 Read GetKeyValue Write SetKeyValue;
      End;
 
4. New boolean method: IsSeedKeysSupported(TArcType);

   Not all decompressors contain the above Seed[..]Keys properties.  It is 
   good practice to always verify support with the component in use, prior 
   to their use.   Improper use of either of these two properties with a 
   component which does not support them will result in an exception being 
   raised.
 
   Example: If IsSeedKeysSupported(UnZip1.ArcType) Then ...
 
   Note(s):
   a. The ZipV2 encryption algorithm has always been a rock solid encryption 
      method for archives since it's introduction into the original Pkzip v2.0 
      DOS archive application.  Since it's inclusion, there have been 3 seed-key 
      values hard coded into every zip application whose values are:
 
      Key 0: 305419896
      Key 1: 591751049 
      Key 2: 878082192
 
      These values are hard coded into every application supporting the zip 
      archive format and password encryption.  These three keys are the only 
      reason the Zipv2 encryption algorithm was open to the brute force hack 
      attack.  Consider our findings with the use of the TZipKey component:
 
                                           #     |------ Possible combinations -------|
      CharSets property   Char set       chars   with 4 char pwrd    with 5 char pwrd
      --------------------------------------------------------------------------------
      csNumeric           | 0..9        ->  10 |          10,000  |           100,000 |
      csAlphaUpperCase    | A..Z        ->  26 |         456,976  |        11,881,376 |
      csAlphaLowerCase    | a..z        ->  26 |         456,976  |        11,881,376 |
      csAlphaULcase       | a..Z        ->  52 |       7,311,616  |       380,204,032 |
      csAlphaNumeric      | 0..10, a..Z ->  62 |      14,776,336  |       916,132,832 |
      csAlphaNumericU     | 0..10, A..Z ->  36 |       1,679,616  |        60,466,176 |
      csAlphaNumericL     | 0..10, a..z ->  36 |       1,679,616  |        60,466,176 |
      csFullSet           | 0..255      -> 256 |   4,228,250,625  | 1,078,203,909,375 |
      csNonAlphaNumeric   |             -> 193 |   1,387,488,001  |   267,785,184,193 |
      --------------------------------------------------------------------------------

      Note the csFullSet (using upper/lower case, and numeric chars) line 
      with a 5 char password.  There are over 1 trillion, 78 billion possible 
      combinations of 5 chars which could possibly be the password! Even with 
      today's computers, it could take  weeks or even months (never could wait 
      long enough really for a conclusive time) for a computer doing nothing but 
      scanning possible combinations to compromise a simple 5 char password.  
      This also is using the hard coded three seed-keys mentioned above.  Now, 
      consider changing the seed-keys, using the same csFullSet, 5 char password.  
      The possible combinations are OFF THE CHART.   Before we can begin a brute 
      force search for the characters in the password, we must have the encrypting 
      seed-keys values... possible key value combinations: 4294967295 * 
      (4294967295  * 4294967295).  Not likely without first hand knowledge of the 
      key values. The possible combinations for the password are now ((4294967295 * 
      (4294967295  * 4294967295)) * 1,078,203,909,375).  Not totally impossible, but 
      with numbers that huge, what is the probability? 
 
      I wrote the TZipKey component several years ago (a brute force encryption 
      attack) as a method of retrieving lost or forgotten passwords.  It's the most 
      widely known password attack against zip encrypted archives known (to date, 
      I know of no one that has come up with a better or faster method of archive 
      password retrieval).  As a test of the AES encryption algorithm, I recently 
      updated the TZipKey component to include the AES algorithm (not for 
      distribution... don't ask) .   The AES encryption method has recently been 
      selected as the most secure data encryption method currently in use, but it 
      was just as vulnerable to the brute force attack as the original zipv2 
      algorithm was...with the exact findings as the above chart for the zipv2 
      algorithm   It is my opinion that the most secure method of archive encryption 
      is the revision of the previously hard coded constant seed-keys.  Study the 
      algorithm... it's simply irreversible... can't be done... impossible.  The 
      only hole (a very small hole I might add) in the zipv2 encryption algorithm 
      was the hard coding of the 3 seed-keys.  
 
 
      The use of, and security of Seed-Keys: 
      The use of unique seed keys does come with a cost.  Revise a seed-key, 
      password protect compressed files, lose the seed-key values the files were 
      encrypted with... there is absolutely no way to decrypt and decompress the 
      archive.  The data is simply lost.  Is this heightened level of security worth 
      the cost?  The US Military thinks so.  They have been using seed-keys for 
      encrypting classified and top secret data and communications for decades.  
      Unique seed-keys in encryption is at the top of the chain for data security.   
      Even if your company's unique keys were to be compromised, your back to a 
      pretty good level of security the original zipv2 encryption afforded you... 
      approx 95-99.9% depending on the number and mixture of chars used in the 
      password.
 
 
5. TArc2Arc:  ztv[..].tmp files containing the read-only file attribute were not 
   being deleted during cleanup.

6. Compress disk-spanning: the OnClearDisk event was revised to activate every time 
   when FreeSpace < TotalSpace.

7. Support for extraction of files from .cab sfx's (self extractable).  ArcType = 
   atCabExe.  

8. TArc2Arc: 
   a. temp files, created from compressed files containing the hidden file-attribute 
      were not being cleaned up (deleted) when TArc2Arc finishes it's task.  
	  Corrected.
   b. added support for ArcType = atCabExe

9. Revised TFileScan to include support for filenames beginning with the '.' char.  
   I.e., ".testing".
 
7.1.3 Revision(s)

1. TArchiveEditor: previous versions were unable to correctly edit archives created 
   using pkzip v2. Corrected
   
7.1.2 Revision(s)

1. TZipRun Component: added OpenWith property. 
   TOpenWith = (omRegistryAssoc, omCmdLine, omOpenWith);
   
   a) omRegistryAssoc: extracts and runs the specified file using extension 
      associations in the registry.
   b) omCmdLine: extracts and runs the specified file allowing the user to specify 
      a specific application to run the extracted file via command line.
   c) omOpenWith: displays the OpenWith dialog for the user to select an application 
      to run the extracted file.

7.1.1 Revision(s)

1. ztvGbls.pas: Added atB64 to TArcType for support of Base64 decoding. 

2. ztvConsts.pas: Added the .mim extension to ExtArray for support of Base64 
   registry association.

3. TRegArchive (ArcExtensions property): in the Delphi object inspector, either 
   add the .mim extension, or clear all default extensions from this property. 
   The next time your project is run, the .mim extension will be automatically 
   added to this property, and registry associations for this extension will 
   be supported.

4. We're in the beginning stage of supporting double-byte and unicode char sets. 
   If you use any of the following functions in your projects, add an preceding 
   underscore to the function name. There may be some name changes that aren't 
   listed. If looking for a function that was in a previous version, none have 
   been removed... just postfix an underscore to the name:

   AppendDirTail -> _AppendDirTail
   GetFileType -> _GetFileType
   EraseFile -> _EraseFile
   ChangeFileExt -> _ChangeFileExt
   ztvFileExists -> _FileExists

7.1.0 Revision(s)

1. The ArchiveComment comment was changed to a stream object 
   (ztvStreams.TCommentStream). It is now much easier to view & edit the 
   archive main comment. 

2. SetComment method changed to SetFileComment (differenciate between a file 
   and archive's main comments).

3. GetComment method changed to GetFileComment (differenciate between a file 
   and archive's main comments).

7.0.8 Revision(s)

1. Compress Components - StoreDirNames property:

   Affects: 
   StoredDirNames = sdExplorer_Auto or
   StoredDirNames = sdExplorer_UserDefineDefaultDir

   Compression component's property values for testing:
   [CompressComponent].StoredDirNames = sdExplorer_UserDefineDefaultDir;
   [CompressComponent].RecurseDirs := False;
   [CompressComponent].DefaultDir := 'D:\12test\Sub1\;

   Using the following batch file content (test.bat) create the following 
   directory / file structure for testing:
    
   mkdir d:\12test
   mkdir d:\12test\Sub1
   echo "aaa" > d:\12test\Sub1\test1.txt
   echo "aaa" > d:\12test\Sub1\test2.txt
   mkdir d:\12test\Sub1\Sub2
   echo "aaa" > d:\12test\Sub1\Sub2\test3.txt
   echo "aaa" > d:\12test\Sub1\Sub2\test4.txt

   The resulting file structure will be:
   D:\12test\Sub1\Test1.txt
   D:\12test\Sub1\Test2.txt
   D:\12test\Sub1\Sub2\Test3.txt
   D:\12test\Sub1\Sub2\Test4.txt

   Value of the FileSpec property (same as the above dir structure):
   D:\12test\Sub1\test1.txt
   D:\12test\Sub1\test2.txt
   D:\12test\Sub1\Sub2\test3.txt
   D:\12test\Sub1\Sub2\test4.txt

   Previous versions: stored structure in the resulting archive was: 
   Test1.txt
   Test2.txt
   D:\12test\Sub1\Sub2\Test3.txt
   D:\12test\Sub1\Sub2\Test4.txt

   Current version: stored structure in resulting archive is:
   Test1.txt
   Test2.txt
   Sub2\Test3.txt
   Sub2\Test4.txt

   Note(s)
   1. Notice the Sub2\Test3.txt and Sub2\Test4.txt names stored in the 
      archive are sub-directories of the value assigned to the DefaultDir 
	  property above ('D:\12test\Sub1\').
   2. The use of the sdExplorer_UserDefineDefaultDir setting requires 
      assigning the DefaultDir property a valid existing directory name.

7.0.7 Revision(s)

1. AES (block cipher Rijndael) encryption revisited.

7.0.6 Revision(s)

1. TUUEncode and TUUDecode.pas: added Base64 encoding/decoding.

7.0.5 Revision(s)

1. Bug found in the extraction of AES encoded "stored" (no compression) 
   files. Fixed. 

7.0.4 Revision(s)

1. [Compress Component].StoredDirNames property: UserDefineDefaultDir 
    changed from case sensitive to case insensitive.

   Example: 
   The following would fail due to case sensitivity. 
   ZipSplit1.DefaultDir := 'E:\';
   ZipSplit1.FileSpec.Clear(); ZipSplit1.FileSpec.Add('e:\test\*.*');
   ZipSplit1.Compress();

2. [Compress Component].ExcludeSpec property: this property no longer 
   requires a fully qualified path. 

   Example: 
   ZipSplit1.FileSpec.Clear(); 
   ZipSplit1.FileSpec.Add('e:\temp10\*.*');
   ZipSplit1.ExcludeSpec.Clear(); 
   ZipSplit1.ExcludeSpec.Add('cache\*.*');
   ZipSplit1.RecurseDirs := True;
   ZipSplit1.DefaultDir := 'e:\';
   ZipSplit1.StoredDirNames := sdExplorer_UserDefineDefaultDir; 
   ZipSplit1.Compress();

   e:\temp10\cache: cache is a sub-directory of e:\temp10. 

   Previous versions of ZipTV required the ExcludeSpec property to contain 
	 the fully qualified path e:\temp10\cache in order to exclude files from 
	 this directory. Note in the above example that 'cache\*.*' is not 
	 allowed. However, it must be a subdirectory of one of the strings 
	 defined in the FileSpec property.

7.0.3 Revision(s)

1. TUnRar: bug developed in v7.0.2 due edits done in that version.

7.0.2 Revision(s)

1. TUnGzip: updated to support unix created multi-header compressed .gz 
   archives. Don't confuse this with multi-file. The .gz format is still 
	 a single file compressor, but some versions of the UNIX / LYNIX gzip 
	 utility,  the compressed data stream is broken into multiple segments 
	 and separated by these headers. 

   Example test files: 
   http://www.ziptv.com/TestFiles/gc5.0alpha3.tar.gz
   http://www.ziptv.com/TestFiles/old_access_log.2000Aug.gz
   http://www.ziptv.com/TestFiles/old_access_log.2001Jan.gz
   http://www.ziptv.com/TestFiles/old_access_log.2002Apr.gz
	 
7.0.1 Revision(s)

1. TZip, TUnZip, TZipSplitter, TJar, TUnJar Components: 
   a) added the much requested  AES (block cipher Rijndael) encryption. 
	    The zip AES standard is now based on Dr. Brian Gladman's implemen-
		  tation of the Rijndael algorithm. 

2. TZip, TZipSplitter, TJar: 
   a) ztvBase.pas new property: TZipCommon.GetEncryptionMethod(): 
	    TEncryptionMethod.   
      Returns one of the following TEncryptionMethod members: 

      TEncryptionMethod = (emNone, emAES2_ 1 28, emAES2_ 1 92, emAES2_256, 
		                       emZIP_v2, emUnsupported); 

   b) EncryptionMethodStr (ztvGbls.pas).  Returns the string equalivant of 
	    the above TEncryptionMethod.    

		  
3. Linking ZipTV AES into the ZipTV Components: 

   In BCB's project options, set the conditional define as MCSREG. In the 
	 source version, failure to follow this step will result a failure to 
	 compile with error message "[Fatal Error] ztvBase.pas: Unit ztvRegister 
	 was compiled with a different version of ztvBase.TZipCommon. 

NOTE(s) 
* The sources for AES encryption are not yet available. 
* Our AES implementation require no external dll's!

6.8.4 Revision(s)

1. All compress components - OnDeleteFile Event 
    a) the value of this event's "count" parameter (count of files deleted. 
		   including the current file) started at 0 instead of 1.  Fixed. 
    b) when the value of the Switch property is "swMove" and the file 
		   already exists in the archive, the file was not deleted from disk. 
		   Fixed. 

6.8.3 Revision(s)

1. TUUEncode & TUUDecode
   Updated for compatibility with .zip multi-volume archives.
		 
2. All compression components -- VerifyBeforeDelete property 
   When the Switch property equals swMove and the VerifyBeforeDelete 
	 boolean  property was true (default = false), files were properly added 
	 to the archive, but not deleted from disk. 
	 
6.8.2 Revision(s)

.zip disk-spanning bug fix.

6.8.1 Revision(s) 

Decompression components - ExtractToFileStream method bug fix 

6.8.0 Revision(s) 

This revision changes some event parameters! Please read! 

When loading projects developed under previous versions, BCB will report 
these event changes and request to remove the reference to the event. 

When loading a project in this version and Delphi reports these event errors:
a) Write down the component and event names so you can re-install the code 
   from the old, to the new event handler. 
b) Let Delphi remove the reference. 

After the project is loaded: 
a) Delete the event defination (but not the event handler - containing the 
   event's code). 
b) In the object inspector, double click on the event name (BCB should have 
   already removed the reference, so it should be blank). 
c) Copy your code from the old to the new event handler. 
d) Delete the old event handler (including the code you've copied to the 
   new handler).
e) Inspect the new event handler for changes which may affect the code you
   have copied to the new handler. 

1. TRegArchive Component - OnAssociation event. 
    Parameter revision: 

    Old declaration: 
    TOnAssociation = Procedure(Sender: TObject; Appname: String) 
    Of Object; 

    New declaration: 
    TOnAssociation = Procedure(Sender: TObject; Appname: String; 
    Var Cancel: Boolean) Of Object; 

    Previous versions: 
    This event was activated if the ActivateOnStartup property was true. 
		When true, during application startup,  this event activated.  Within 
		this event, the "install method" would be assigned to install the file 
		extension associations into the registry.  In this version, a cancel 
		method was installed to the OnAssociation event.  If cancel is true 
		(default), the install method will not be called internally, and the 
		association process is canceled. 

    This version: 
    The OnAssociation event MUST be set and the  value of the "cancel" 
		parameter must be false, for user confirmation of the registry 
		association edits.  If it is not set, and the cancel parameter is true 
		(default) no file  associations in the registry will take place. 

    DO NOT CALL THE "INSTALL METHOD" FROM WITHIN THIS EVENT. SET ONLY THE 
		CANCEL PARAMETER TO FALSE, IF REGISTRY ASSOCIATIONS ARE TO TAKE PLACE.     

2: TRegArchive Component - Install method
    The "install method" is now a function of type ShortInt, returning the 
		following result codes: 

    raComponentState = ComponentState is in csDesigning mode 
    raCancel = OnAssociation's "cancel" boolean parameter was true (default) 
    raOnAssociation = OnAssociation event was not set 
    raOk = associations was written to registry 
    raNoneRequired = no associations were required (already associated)

3: TZipTV, TZipRun, all decompression components
    Added property ExcludeSpec
    Added event OnExcludeFile 
    This property and event has always been present in the compressor 
		components, now added to the above mentioned components.  Their 
		function is to narrow the specification of files for processing in 
		conjunction with the FileSpec property.  

    Using the decompressor components as an example, the FileSpec property 
		might contain the wildcard '*.*' (which means to include all  files for 
		processing). The ExcludeSpec property is assigned the wildcard '*.txt' 
		which means to exclude all files for processing which has the .txt file 
		extension.  

    The OnExcludeFile event is activated once for eah file found to match 
		the FileSpec specification, but is in the list of files to be excluded. 

4. TArchiveEditor Component - OnBatchSkipFile event 
    Parameter revision: 

    Old declaration: 
    TOnBatchSkipFile = Procedure(Sender: TObject; NewFileName: String; 
		    Index: Integer; Var SkipChange: Boolean) Of Object; 

    New declaration: 
    TOnBatchSkipFile = Procedure(Sender: TObject; OldFileName, 
		    NewFileName: String; Index: Integer; Var SkipChange: Boolean) Of Object; 

    The original name of the compressed file (OldFileName) was also 
		necessary to better determine which file names to skip revisions. 

5. ztvInflate.pas and ztvDeflate.pas
    ztvInflate.ztvDecompress_StreamToStream revised 
    ztvDeflate.ztvCompress_StreamToStream revised 

6. TZipSplitter Component - OnSplitEnd event 
    Parameter revision: 

    Old declaration:
    TOnSplitEnd = Procedure(Sender: TObject) Of Object; 

    New declaration: 
    TOnSplitEnd = Procedure(Sender: TObject; VolumesCreated: Cardinal) Of Object;     
		
6.7.1 Revision(s) 

   TOnNextVolume event: changed parameter VolumeID from data type 
	     AnsiString to Integer. 

   Old declaration: 
   TOnNextVolume =  Procedure(Sender: TObject; Var VolumeName: AnsiString; 
	     VolumeID: AnsiString; fExists: Boolean; Var Cancel: Boolean) Of Object; 
   
   New declaration: 
   TOnNextVolume =  Procedure(Sender: TObject; Var VolumeName: AnsiString; 
	     VolumeID: Integer; fExists: Boolean; Var Cancel: Boolean) Of Object; 
		   
6.7.0 Revision(s)

New component: use TZipSplitGlue, combine a multi-volume .zip achive into a 
single (non-volume) output .zip archive. 

6.5.5 Revision(s)

1. TUnZip: disk-spanning bug arose during development of TarchiveSplitter 
   and TZipSplitter components. Fixed. 

6.5.3-4 Revision(s)

1. Delphi revisions only

6.5.2 Revision(s) 

1. All compressor components OnStoreFilesOfType property: 

a) On creation of a compressor component, this TStrings property was 
   incorrectly inserting a blank line, resulting in files without 
   extensions to be stored in an archive with no compression. 
b) If this property was set in Delphi's object inspector, an exception
   will raise.
c) If this property wasn't set in Delphi's object inspector, the problem 
   will not show.

6.5.1 Revision(s)

1. TZipSplitter: added support for the CompressionMethod property 
   (supported by all other compressors). Prior versions could not 
   successfully compile zip archives with CompressionMethod = cmInMemory. 
   There are two possible settings for ths property, cmTempFile and 
   cmInMemory. 

August 29, 2003 - 6.5.0 Revision(s) 

1. TZipSplitter: this is the first version where this component can 
   actually and reliably replace the TZip component. It has the ability 
   to add and delete files from multi-volume zip files. 
2. Messages passed to the OnError event were updated.
3. TArchiveEditor: bug found and fixed when editing .tar file filenames
   and dates.
4. TUUEncode and TUUDecode : bug found and fixed.
5. TZipKey : bug found and fixed. 

Note 1: The secret to TZipSplitter is it’s OnSplitBegin event. When this 
        event handler is activated, a form can be displayed, requesting 
        volume size (no volume split is an option) number of output 
        volumes etc. TArchiveSplitter and TZipSplitter do not at this time 
        support files greater than 4 gig. If this feature is required, 
        use the TZip component.

Note 2: To enable debug of ZipTV, change the following line in ziptv.inc 
        unit: {.$define ENABLE_DEBUG} to {$define ENABLE_DEBUG} (dot 
        before $define removed)

Note 3: Zip volumes created using TArchiveSplitter and TZipSplitter are 
        compatible with volumes created by WinZip. ZipTV takes zip split 
        volumes a step further in the ability to split zip volumes during 
        the creation of an archive. Not available in any other archive 
        format is the ability to add and delete files from volume 
        archives (TZipSplitter).

Note 4: Projects developed with the registered version of ZipTV must 
        always be compiled using MCSREG as a conditional define. This 
        conditional isn’t mandatory in the current release, but will 
        be so in future versions. 

6.4.1 Revision(s) 

1. TArchiveSplitter and TZipSplitter upgrade
2. Some constants were moved from various units to the ztvConsts.pas 
   unit. If you encounter a "undeclared identifier" error, add ztvConsts 
   to that units uses clause.
3. Error reported editing zip archive and file comments. Fixed.

6.4.0 Revision(s) 

1. Maintenance release.

July 14, 2003 - 6.3.2 Revision(s) 

1. TZipSplitter: merged into parent objects for basic usage simularity with 
   other compressor components.
   
2. TZipTV and TUnZip updated for compatibility with WinZip 9.0 support of 
   unlimited sized archives.
   
3. Bug fix: v6.3.1 introduced a compatibility issue with Win9x OS's. We 
   used a function to handle the compressed output temp file which was not 
   compatible with Win9x. Fixed.
   
June 9, 2003 - 6.3.1 Revision(s) 

1. Bug created in the May 29th release. Procedure 
   TZipCommon.TempFileMoveFile(...) (in ztvBase.pas) was added for seamless 
   handling of moving of the created temp file with all compressors. When 
   attempting to create archives on seperate fixed drives, the temp file 
   was not moved. Fixed.
   
May 29, 2003 - 6.3.1 Revision(s) 

1. TArchiveEditor: we've spent alot of time on the update of this 
   component. It is no longer being considered beta.

May 2003 - 6.3.0 Revision(s) 

1. TUnAce: when renaming extracted files (via the OnRename event), 
   directories contained in the unrenamed file were created.
   
2. TZipTV: updated to support unicode rar filenames.

3. TUnRar: updated for proper extraction of unicoded filenames.

4. TArcSplitter: internal properties were updated to interact with other 
   related properties. The revision greatly reduces the number of improper 
   set property values.

April 29, 2003 - 6.2.0 Revision(s) 

1. In version 6.1.1 we revised the ExtractDir property to default to the 
   path where the extracting archive resides. This change was implemented
   to account for a blank value of ExtractDir. However, it created a bug 
   in the TArc2Arc component. 

April 14, 2003 - 6.1.1 Revision(s)

1. ZipTV supports the extraction of specific files even from split .zip 
   archives.

April 1, 2003 - 6.1.0 Revision(s)

1. When attempting to compress archives to diskette which do not support 
   disk-spanning, a disk-full error is now routed through the OnError event.
   
2. Compression Components: if the values of TempDir property and ArchiveFile 
   property are located on the same drive, a FileMove is involked to move 
   the temporary output file, instead of a stream copy. This increases 
   completion speed dramatically.
   
3. TArchiveSplitter: the remaining issue with this new component was 
   resolved. If the size of the central directory exceeds the desired output 
   volume size, the central directory is now split correctly between multiple 
   output volumes.
    
4. Decompression Components: OnRenameFile event added.
 
5. All components (ztvFileIo.pas): ArchiveDate (or fArchiveDate in some 
   versions) reported time in UTC instead of local time.

February 25, 2003 - 6.0.0 Revision(s)

1. New component: TArchiveSplitter. Starting with v5.2, TZipTV & TUnZip 
   supported split archives created under WinZip. This new component now 
   includes support for the creation of these archives.
   
2. All components were edited for enhanced streaming support. ZipTV now 
   supports compression / decompression to and from the clipboard, strings, 
   buffers, etc. This support opens a wide range of usage for our components.

February 4, 2003 - 5.6.2 Revision(s)

1. Added support for .war archives. For more info on the .war format see 
   http://java.sun.com/webservices/docs/1.0/tutorial/doc/WebApp3.html

February 3, 2003 - 5.6.1 Revision(s)

1. Added ability to read and display (TZipTV) .cab sfx (executable) 
   archives as well as the ability to extract (TUnCab) compressed files 
   within these sfx's.
 
January 31, 2003 - 5.6 Revision(s)

1. TRegArchive: when running an application through a network, the 
   computer name and drive was being improperly written to the reigstry 
   when associating archive extensions to the application.

January 29, 2003 - 5.5 Revision(s)

1. TZipTV and TUnRar: updated these two components to handle .rar 
   archives whose compressed and/or uncompressed file sizes exceed the 
   4 gig barrier.

January 24, 2003 - 5.4 Revision(s)

1. Compression Components (Attributes and AttributesEx properties): added 
   support for the FILE_ATTRIBUTE_NOT_CONTENT_INDEXED and 
   FILE_ATTRIBUTE_ENCRYPTED file attributes.
    
2. TUnAce: rewrite of this component for better handling of the extraction 
   of specific (selected) files within an .ace archive.
   
3. TZipTV and TUnArj: added a 5000k buffer to search deeper into a file
   for the .arj archive signature, allowing a more precise identification 
   of an .arj archive.
   
November 1, 2002 - 5.3 Revision(s)
   

1. TZip, TUnZip, TZipTV: added support for compression of files with sizes 
   greater than 4gb on NTFS formated drives. This revision will require 
   the following revisions to projects developed with prior versions:

   Event: OnFileScanStatus
   Parameter: FilesSize changed from type double to int64
   Components effected: TZip, TBlakHole, TGZip, TTar, TMakeCab, TJar, TLha

   Event: OnTotals
   Parameter: UnpackedSize and PackedSize changed from type double to int64
   Components effected: TZipTV
   
October 1, 2002 - 5.2 Revision(s)

1. Added support for WinZip's split volume archives. This version supports 
   the viewing and decompression of multi-volume zip archives, the next 
   revision will include the new component TArchiveSplitter which will 
   support the compression of compatible multi-volume split zip archives.
   
July 5, 2002 - 5.0 Revision(s)

1. Deflate64 method now supported

June 21, 2002 - 4.8.6 Revision(s)

1. All components interacting with SFX archives have been updated for the
   current ztv_*.sfx stub files. These components (all decompression
   components, TZipTV, TMakeSfx, TUnSfx) were updated also to include SFX
   archives created by a greater number of non-ZipTV SFX archives.
   
2. Archive detection routines updated for smoother interaction between
   components.

   Be sure to download version 4.8.6 of the ZipTV sfx-stub files!

June 8, 2002 - 4.8.5 Revision(s)

1. ztv_lha.sfx: upgraded for support of the Frozen7 compression method.

2. TMakeSfx & TUnSfx: updated for compatibility with the latest 
   sfx-stub files.

June 3, 2002 - 4.8.4 Revision(s)

1. ztv_ace.sfx: upgraded for support of the ace version 2 archive format.
   Requires unacev2.dll from the ZipTV Compression Components (installs 
   in your system dir when ZipTV is installed).
   
2. ztv_rar.sfx: upgrade for support of the rar version 3 archive format.
   Requires unrar3.dll from the ZipTV Compression Components (installs
   in your system dir when ZipTV is installed).
   
3. TZipTV, TUnAce, TUnRar: upgraded for support of the above two sfx
   (executable) archives. These components can read, list, and extract
   these new executable archives.
   
4. TUnLha: upgraded for support of the latest compression algorithm
   (frozen7). 

May 13, 2002 - 4.8.3 Revision(s)

1. small fix to the decompressor component's OnRecurseDirs property. 

May 8, 2002 - 4.8.2 Revision(s)

1. Maintenance release.

2. First version for Borland C++ Builder 6!

April 13, 2002 - 4.8 Revision(s)

1. TArchiveEditor: new "beta" component. Edit an archive's compressed 
   filenames, dates, and file-attributes. 

April 7, 2002 - 4.7.1 Revision(s)
1. TUnCab: modifications by the brilliant mathematician and programmer, 
   Alexey Chernobaev, to support the proper handling of nested .cab files 
   (archive within archive).

2. TArc2Arc: upgraded to include support of proper conversion of many 
   archive types to a .tar.gz arhive.
   
March 21, 2002 - 4.6.8 Revision(s)

1. Compression Components (TJar, TZip, TBlakHole, TLha): added property 
   StoreFilesOfType property. Add extensions (including the dot char '.'), 
   of file-types to store into the archive, instead of using compression. 
   For example, to store an already compressed .zip archive into another 
   archive (instead of attempting to compress it again) add the extension 
   .zip to this property.
   
2. StoreAlreadyCompressedFiles property removed. With the addition of the 
   StoreFilesOfType property, this property is now obsolete.
   
3. TStoredDirNames: 
   a. renamed set member sdExplorer as sdExplorer_Auto. Use this member 
      to add multiple FileSpecs from multiple directories. Any prior 
      setting of the DefaultDir property is ignored, and is set 
      automatically according the what directory is common to all 
      FileSpecs.
   b. Added member sdExplorer_UserDefineDefaultDir. 
      sdExplorer_UserDefineDefaultDir requires the setting of DefaultDir 
      as the rootdir prior to calling the Compress() method. For example, 
      if you dropped files from the Windows Explorer, from directory 
	  c:\windows\system, set the DefaultDir property as 'c:\windows\
      system'. The dropped files directories will be stored into the 
      archive accordingly.

February 16, 2002 - 4.6.5 Revision(s)

1. TUnRar: added support for extraction of split files from diskettes. 

February 14, 2002 - 4.6.4 Revision(s)

1. TUnRar: added support for RAR split files (filename.part1.rar, 
   filename.part2.rar, filename.part3.rar, etc.). Old multi-volume naming 
   convention is still supported (filename.rar, filename.r00, filename.r01, 
   etc.).
   
2. TZipRun: added OnNextVolume event for support of the new RAR split-file
   / multi-volume support.
   
3. TZipTV: revised to support RAR split-files.

February 12, 2002 - 4.6.3 Revision(s)

1. TZip / TUnZip: EncryptHeaders property. Foriegn characters in filenames 
   were not being property restored when the EncryptHeaders property was 
   true.
   
2. TTar: progress bar was not being updated properly when adding "huge" 
   files to a .tar file.

February 6, 2002 - 4.6.1 Revision(s)

1. TZip / TUnZip: installation of function to properly handle foreign 
   char sets.

February 5, 2002 - 4.6.0 Revision(s)

1. TUnRar: included main archive comment and password protected archive 
   support. This component, recently upgraded for compatibility with the 
   new .rar v3.0 format, is now complete.
2. TUnRar: renamed unrar.dll to unrar3.dll for version identification 
   purposes. 

January 31, 2002 - 4.5.5 Revision(s)

1. TZip / TUnZip (EncryptHeaders property): a routine which handles a #0 
   char (end_of_string) in foreign chars sets, was interfering with the 
   compressed filename encryption routine. Encrypted filenames sometimes 
   contains this char... when altered for foreign char sets, naturally the 
   decryption function was not returning the proper decrypted filename. 

January 28, 2002 - 4.5.4 Revision(s)

1. TUnRar: bug fix created in 4.5.3 revision which prevented extraction of 
   compressed .rar files from readonly drives, such as a cd rom.
   
2. TUnRar: installed error handler for .rar "broken archive". Previous 
   version terminated with no error reported.

January 25, 2002 - 4.5.3 Revision(s)

1. Updated TUnRar for compatibility with the new v3 rar format.

January 24, 2002 - 4.5.2 Revision(s)

1. Bug found in WinZip with regard to crc calculation of .zip archive 
   "stored" files. Adjustment made to compensate for this bug so the TZip 
   component is compatibility with WinZip's stored files.

January 23, 2002 - 4.5.1 Revision(s)

1. Installation of all .zip diskette spanning functions into v4 series 
   (moved over from v3.x) now complete.
   
2. Fix with regard to network unc-pathnames.

January 21, 2002 - 4.5.0 Revision(s)

Maintenance release

January 16, 2002 - 4.4.0 Revision(s)

1. New streaming methods installed which improves compression speed even 
   further. Test results compressing a 2 gigabyte text file using WinZip 
   = 14 minutes, ZipTV = 7.4 minutes.
   
2. New .ace format updates. Multi-volume archive updates.

3. Diskette-spanning updates.

4. Addition of huge archive compression / decompression support.
 
October 15, 2001 - 4.1.9 Revision(s)

1. Removed limitation regarding compatibility with other utilities (such as 
   WinZip) in the downloadable shareware version. Shareware version now 
   creates compatible archives.
   
2. This will be the last update for the downloadable shareware version in 
   the version 4 series. Updates will continue with the registered version.
 
October 14, 2001 - 4.1.8 Revision(s)

1. Beta status removed... help file still requires updating.

2. StoredDirNames (sdExplorer set member): updated for better drop / drag 
   operations.

3. TMakeSfx: updated for compatibility with sfx stubs.