From e6dd1487ff2a835924f09195c67867fc26126b2a Mon Sep 17 00:00:00 2001
From: Glenn Maynard This library allows creating, modifying and extracting zip archives in the
-compatible way with PKZIP (2.5 and higher) and WinZip. Supported are all
-possible operations on the zip archive: creating, extracting, adding, deleting
-files from the archive, modifications of the existing archive. There is also the
-support for creating and extracting multiple disk archives (on non-removable
-devices as well) and for password encryption and decryption. This module uses
-compression and decompression functions from zlib library by Jean-loup Gailly
-and Mark Adler. Zip is a static library and statically links to compiled zlib.lib (version
-1.13 nowadays). The zlib library can be replaced with a newer version providing
-you also replace the files: "zlib.h" and "zconf.h" in the
-Zip project. The Zip library uses MFC in a shared library as a Release and Debug
-Configuration. Your project must use MFC in the same way in the appropriate
-project configuration. You may need to adapt this to your needs. To add Zip
-library functionality to your project you need to link the library to the
-project. You can do this in at least two ways (in both cases you need to include
-ZipArchive.h header in your sources like this: #include "ZipArchive.h"): Add "..\Zip\debug(release)\Zip.lib" to Project
-Settings->Link->Input->Object/library modules and add Zip
-directory to the preprocessor searches (Project Settings -> C++ ->
-Preprocessor -> Additional include directories). Insert Zip project into workspace and set project dependencies (your project
-dependent on Zip project). The details about using this library are in the sources. The example
-available for download at the bottom of the page is an almost complete
-compression\decompression program. There are only main issues mentioned below
-about using this library. If you have a question about using the library and you
-can't find the answer here, don't hesitate to ask. There are some functions defined for fast operations on archive; among
-others: AddNewFile(), ExtractFile(), DeleteFile(). You only need to call
-functions Open() - before and Close() - after using them. This library supports two kinds of multi-disk archives: This two disk spanning modes create volumes with compatible internal
-structure. It means that you can easily convert the volumes created in one mode
-to the other one by renaming the files (in TD mode each volume but last has a
-number as an extension). To convert the archive from TD to PKZIP compatible
-archive, copy each file to the removable media, giving them the extension
-".zip". You should also label each disk with the appropriate label
-starting from "pkback# 001". There is a limited functions set available during work with multi-disk
-archives. Only adding is allowed when creating an archive and only extracting
-and testing when opening an existing one. Deleting files from these archives
-isn't allowed in any of these cases. Class CZipArchive uses write buffer to make write operations extremely fast.
-You can change its size with SetAdvanced() function. While creating a multi-disk
-archive, set the size of the buffer to the maximum size of the volume for
-the best performance. The popular archivers such as PKZIP and WinZip cannot operate on archive in
-TD span mode. You need to convert them to PKZIP span mode (have a look above).
-Remember about copying the files to the removable media (it does not comply with
-Winzip, which can extract a multi-disk archive from any media but only from the
-fixed location on the drive). This library supports creating and extracting of the
-password protected archives. There are several issues you should be aware of
-when using this feature. To set the password for the file to be added or
-extracted call the function SetPassword() with the password as the argument. To
-clear the password call this function without arguments or with an empty string
-argument. The function has no effect on a closed archive and on the currently
-opened file (whether new or existing) inside archive. During opening an archive
-the password is cleared and it is not changed if the file inside archive is
-opened. You can set different passwords for different files inside the same
-archive, but remember to set it BEFORE opening the file. You cannot use ASCII
-characters with codes above 127 in a password, if you do so, the function
-SetPassword() returns false and the password is cleared. If the password is
-cleared, no encryption or decryption take place. The library automatically detects self-extracting archives. This is the
-simplest self-extract code : After compiling it and appending a zip archive to it (e.g. with the DOS
-command: copy /b SelfExtract.exe + ZipFile.zip FinalFile.exe) we have a
-self extracting archive. The new functions has been provided to allow the testing of the integrity of
-the archive. The first one is CZipArchive::TestFile which is a
-comprehensive testing function, but if you need a different functionality, you
-can make your own by taking advantage of the second function provided: CZipArchive::CloseFileAfterTestFailed.
-The detailed description and the example of use are provided in the sources
-and in the example project. The library throws the following exceptions: CMemoryException, CFileExeption
-and CZipException. The first two don't need an explanation. The last is thrown
-when some internal error occurs. Handling them may be done in the following way: The extra field of the file can be different in the local and central
-headers. To set the extra filed in the local header set it in header
-parameter of CZipArchive::OpenNewFile function. After
-that the extra field is written to the local header and cleared. You should call
-CZipArchive::SetExtraField function anytime after opening the new file
-(but before closing it) to set the file extra field in the central directory. To run the example, integrate first Zip library into it (Zip library is not
-included in the example, you must download it separately); you should be asked
-at the beginning about the location of the Zip project, if not, use one of the
-integration methods described above. If you don't put Zip library project at the
-same directory level what the sample application is, you also have to change the path pointing
-to ZipArchive.h in the file testzipdlgdlg.h. When you experience linking errors (mostly LNK2005) you need to
- make sure that the library and your program are both using
- single-threaded or both multithreaded library. The option "Project->Settings->
- c/c++ ->Code Generation->Use run-time library" should be set
- to the same value in the ZipArchive library and the program project options.
- If it doesn't help, try recompiling the zlib library ( zlib.lib
- provided with the project is compiled from a release configuration and using Multithreaded
- DLL run-time library ). You can download the zlib library
- sources from http://software.artpol.com.pl/d_zip.html.
- Use zlibstat project. Set "Use run-time library"
- option to the same value as you set it in ZipArchve library and your program
- configurations. Compile the Release configuration of the zlib library and
- replace with it the file zlib.lib in the ZipArchive folder. You may
- however experience linking warnings or errors while compiling the Debug
- configuration. To eliminate them do as follows:
- I currently work on the non-MFC version of the library and a multi-platform
-support. Make sure to check out the site http://software.artpol.com.pl
-which is more likely to have an updated version. Download source - 110 KB
( they are not embedded into existing ones, but made separated, since the DLL version needs separated project for zlib.dll and for the static version,
+ zlib library is already included in the projects to minimize linking problems with applications)
+ - added CZipArchive::WillBeDuplicated which lets you check quickly if the given filename would duplicate an existing one in the archive
+ - CZipArchive::GetCount has now an additional parameter and can return the number of files in the archive not counting the directories
+ - CZipArchive::Close has been given also an additional parameter (\e bUpdateTimeStamp) and can set the modification time of the zip archive to the modification time of the newest file inside the archive
+ - method CZipArchive::GetIndexes added
+ - ZipArc application updated to support renaming, replacing (as well as updating files in the archive) and getting compressed files from another archive
+
+ Changes:
+ - zlib library updated to version 1.1.4 that fixes the security vulnerability in version 1.1.3
+ as described in
+ \htmlonly
+ http://www.zlib.org/advisory-2002-03-11.txt
+ \endhtmlonly
+ - if the file inside the archive has the wrong date/time stamp set, then the extracted file is given the current time instead of reporting an error
+ - a little change in CZipArchive::PredictFileNameInZip : parameter \e bAnsiOem changed to \e bExactly (apart from the name, the meaning has also been changed)
+ - removed parameter bFileNameOnly from CZipArchive::DeleteFiles(const CZipStringArray &);
+
+ Bugs fixed:
+ - eliminated possible errors when using CZipArchive::zipsmCheckForEff with disk-spanning mode
+ - reading some files created with other archivers failed occasionally in CZipFileHeader::ReadLocal (thanks to Christian von Seydlitz)
- while a file recompression (smartness level included CZipArchive::zipsmCheckForEff) if the
AutoFlush feature was enabled, there were redundant bytes added to the archive (thanks to Roman Scherzer)
-
- ver 2.2a (11-2001)
-
- Bugs fixed:
- aborting extraction of multi-disk archive caused errors (thanks to Sabina Terenzi)
+ - some GUI fixes in ZipArc
+ Known issues:
+ - under Windows XP, in TD disk spanning mode, when the central directory is not entirely
+ written on the last volume (but divided between volumes), \e SHGetFileInfo hangs up (it is used i.e. by \e CFileDialog::DoModal) - Windows probably tries to analize
+ zip structure, but fails becuase it is an additional feature of ZipArchive library to create multi volume archives on non-removable data storage
ver 2.2 (10-2001) Time for global changes
@@ -214,10 +281,9 @@
- Changed names for several classes.
ver 1.3.1 (11-2000)
- - Added support for password encryption and decryption.
- The encryption used in PKZIP was generously supplied by Roger
- Schlafly.
+
- Testing the archive made easier
+ - Added support for password encryption and decryption. The encryption used in PKZIP was generously supplied by Roger Schlafly.
- Unicode support added
ver 1.2.2 (08-2000)
@@ -235,7 +301,7 @@
- one class for zip and unzip functions
- fast adding, deleting and extracting files with a single function call
- ver 1.1.2 (03-2001)
+ ver 1.1.2 (03-2000)
- international characters in filenames inside archive are now
converted in a compatible way with other archiving programs (they are stored
converted to OEM inside archive).
diff --git a/stepmania/src/smpackage/ZipArchive/CodeProject.html b/stepmania/src/smpackage/ZipArchive/CodeProject.html
deleted file mode 100644
index 82a927b70b..0000000000
--- a/stepmania/src/smpackage/ZipArchive/CodeProject.html
+++ /dev/null
@@ -1,380 +0,0 @@
-
-
-
-
-
-Title: Zip and Unzip in the MFC way
-Author: Tadeusz Dracz
-Email: tdracz@artpol.com.pl
-Environment: VC++ 6.0, MFC, Windows 95/98/NT/2000/Me
-Keywords: Zip, Unzip, MFC
-Level: Intermediate
-Description: The library to create, modify and extract zip archives
-Section Miscellaneous
-SubSection General
-
-
-
-
-
-
-
Overview
-How to integrate with the project
-Method 1
-Method 2 (simpler)
-How to use
-Compression and decompression
-
-Remember to call Close() function when you finish working with CZipArchive
-class.Multi-disk archives
-
-1. Disk spanning performed in the compatible way with all other main zip
-programs. It means that the archive can only be created on a removable device,
-the size of the volume is auto-detected and the label is written to the disk. To
-use this kind of disk spanning you need to define a static callback function for
-changing disks and set it with SetSpanCallback() function.
-2. Disk spanning performed in the internal mode, called in the sources TD span
-mode. This allows creating multi disk archives also on non-removable devices and
-with user-defined volume size. There is no need to set callback function in this
-mode.Password encryption and decryption
-
- You can find out what files are password encrypted by calling
-CZipArchive::GetFileInfo() which fills the structrure CZipFileHeader with data,
-and then the method IsEncrypted() of this structure. If it returns true, the
-file needs a password to extract.
- The successful extraction of the encrypted file doesn't always mean
-that the password is correct. CZipArchive doesn't check for a crc if
-m_info.m_uUncomprLeft is not zero in the function CZipArchive::CloseFile(). In
-some cases bad password causes that this value is not zero, so you have to check
-also for the return value of this function (it returns -1 in this case). You can
-also check the size of the extracted file since it is smaller than it should be.Self extract support
-
-int APIENTRY WinMain(HINSTANCE hInstance,
-HINSTANCE hPrevInstance,
-LPSTR lpCmdLine,
-int nCmdShow)
-{
- CZipArchive zip;
-
- // get path of executable
- TCHAR szBuff[_MAX_PATH];
- if (!::GetModuleFileName(hInstance, szBuff, _MAX_PATH))
- return -1;
-
- CString szDest;
- // ...
- // add the code here to get the destination directory from the user
- // for example:
- /* CBrowseForFolder bf;
- bf.strTitle = _T("Select directory to extract files");
- if (!bf.GetFolder(szDest))
- return -1;
- */
- // class CBrowseForFolder is included in the example project
- // remember about including the header!
-
- zip.Open(szBuff, CZipArchive::openReadOnly);
- // openReadOnly mode is necessary for self extract archives
- for (WORD i = 0; i < zip.GetNoEntries(); i++)
- zip.ExtractFile(i, szDest);
-
- zip.Close();
- return 0;
- // this code will not work for the encrypted archives since it is needed
- // to get the password from the user ( a small addition to the
- // existing code I suppose )
-}
-
-
-
-Testing the integrity of the archive
-Exceptions
-
-try
-{
- // ...
- // some operations on Zip library
-}
-catch (CException* e)
-{
- if (e->IsKindOf( RUNTIME_CLASS( CZipException )))
- {
- CZipException* p = (CZipException*) e;
- //... and so on
- }
- else if (e->IsKindOf( RUNTIME_CLASS( CFileException )))
- {
- CFileException* p = (CFileException*) e;
- //... and so on
- }
- else
- {
- // the only possibility is a memory exception I suppose
- //... and so on
- }
- e->Delete();
-}
-
-Handling the extra field
-Sample application
-Linking errors
-
-
-To Do and updates
-Downloads
-
-
-
-Download example - 40 KB
03.2001
-- -
the code has been completely rewritten since the very beginning; the main -improvements are: -
first version; it is just modified code from zip.c and unzip.c files written -by Gilles Vollant and distributed with zlib library; the modifications are as -follows: -
AddNewFile(LPCTSTR, LPCTSTR, int, int, unsigned long)
- \see AddNewFile(CZipMemFile&, LPCTSTR, int, int, unsigned long)
- \todo Replacing files in the archive
-*/
- bool AddNewFile(LPCTSTR lpszFilePath, int iLevel = -1, bool bFullPath = true,
- int iSmartLevel = zipsmSafeSmart, unsigned long nBufSize = 65535);
-
-
-/**
- Add a new file to the archive.
- The same as #AddNewFile(LPCTSTR, int, bool, int, unsigned long)
- but differs by one argument:
- \param lpszFileNameInZip
- the file name that will be stored in the archive (to the directories,
- there is a path separator automatically added at the end); #SetRootPath
- function has no effect on this parameter
+ /**
+ Add a new file to the archive. You can set the callback functor with #SetCallback.
+ \param info see CZipAddNewFileInfo
+ \return \c if it returns false then the file was not added, but the internal
+ state allows you to add other files (which is not possible after throwing
+ an exception)
+
+ \note
+ - If you abort while adding a file in a non-disk-spanning archive, the added data will be removed from the archive
+ - Throws exceptions.
+
+ \see SetCallback
+ \see AddNewFile(LPCTSTR, LPCTSTR, int, int, unsigned long)
+ \see AddNewFile(LPCTSTR, int, bool, int, unsigned long)
+ \see AddNewFile(CZipMemFile&, LPCTSTR, int, int, unsigned long)
+ */
+ bool AddNewFile(CZipAddNewFileInfo& info);
- \see AddNewFile(CZipMemFile&, LPCTSTR, int, int, unsigned long)
-
-*/
- bool AddNewFile(LPCTSTR lpszFilePath,
- LPCTSTR lpszFileNameInZip,
- int iLevel = -1,
- int iSmartLevel = zipsmSafeSmart,
- unsigned long nBufSize = 65535);
/**
- Add a new file to the archive.
- The same as #AddNewFile(LPCTSTR, LPCTSTR, int, int, unsigned long)
- but differs by one argument:
+ \see AddNewFile(CZipAddNewFileInfo& ); the parameters are equivalent to CZipAddNewFileInfo member variables
+
+ */
+ bool AddNewFile(LPCTSTR lpszFilePath, int iComprLevel = -1, bool bFullPath = true,
+ int iSmartLevel = zipsmSafeSmart, unsigned long nBufSize = 65536);
- \param mf
- instead of from the physical file, the data for compression is taken from the CZipMemFile object
- \note
- - the time of the file in zip is set to the current time, and the attributes to the default
- file attributes (depending on the system)
- - you cannot add directories with this function
- \see AddNewFile(LPCTSTR, int, bool, int, unsigned long)
-
+ /**
+ \see AddNewFile(CZipAddNewFileInfo& ); the parameters are equivalent to CZipAddNewFileInfo member variables
+ */
+ bool AddNewFile(LPCTSTR lpszFilePath,
+ LPCTSTR lpszFileNameInZip,
+ int iComprLevel = -1,
+ int iSmartLevel = zipsmSafeSmart,
+ unsigned long nBufSize = 65536);
+
+ /**
+ \see AddNewFile(CZipAddNewFileInfo& ); the parameters are equivalent to CZipAddNewFileInfo member variables
*/
bool AddNewFile(CZipMemFile& mf,
LPCTSTR lpszFileNameInZip,
- int iLevel = -1,
+ int iComprLevel = -1,
int iSmartLevel = zipsmSafeSmart,
- unsigned long nBufSize = 65535);
+ unsigned long nBufSize = 65536);
@@ -469,16 +641,18 @@ public:
\param lpszFilePath
The path to the file to retrieve date stamp and attributes from.
These values are stored inside the archive.
+ \param uInternal
+ for internal use only
\return \c false in the following cases:
- the \e lpszFilePath is not NULL and the file attributes and data was not correctly retrieved
- a file is already opened for extraction or compression
- archive is an existing disk span archive
- - maximum file count inside archive already reached (65535)
+ - maximum file count inside archive already reached (65536)
\note Throws exceptions.
*/
- bool OpenNewFile(CZipFileHeader & header, int iLevel = Z_DEFAULT_COMPRESSION, LPCTSTR lpszFilePath = NULL);
+ bool OpenNewFile(CZipFileHeader & header, int iLevel = Z_DEFAULT_COMPRESSION, LPCTSTR lpszFilePath = NULL, DWORD uInternal = 0);
/**
Compress the contents of the buffer and write it to a new file.
@@ -512,12 +686,108 @@ public:
\param bAfterException
it will close the new file without writing anything (call it also
with this parameter set to \c true after an exception other than CZipException::abortedSafely was
- thrown from one of \e AddNewFile functions)
+ thrown from one of #AddNewFile functions)
\note Throws exceptions.
\see OpenNewFile
*/
bool CloseNewFile(bool bAfterException = false);
+/**
+ Acquire a file with the given index from another archive.
+ The compressed data of the file from another archive are copied
+ without decompressing to the current archive.
+ You can set the callback functor with #SetCallback.
+ \param zip
+ an opened archive to get the file from (must not be multi-disk)
+ \param uIndex
+ a zero-based index of the file to get from the \e zip archive
+ \param iReplaceIndex the same as CZipAddNewFileInfo::m_iReplaceIndex
+ \param bKeepSystComp
+ if \c false, which is default, then the file from \e zip archive
+ system compatibility is converted to the current archive system
+ compatibility (if they differ)
+ \return \c false if the operation could not be performed (either of archives is closed,
+ a file inside either of archives is opened, \e zip archive is multi-disk or the current
+ archive is an existing multi-disk archive)
+ \note Throws exceptions ExtractFile(WORD, CZipMemFile&, DWORD)
\see FindMatches
*/
bool ExtractFile(WORD uIndex, LPCTSTR lpszPath, bool bFullPath = true,
- LPCTSTR lpszNewName = NULL, DWORD nBufSize = 65535);
+ LPCTSTR lpszNewName = NULL, DWORD nBufSize = 65536);
/**
@@ -566,7 +836,7 @@ public:
- if you pass CZipMemFile object already with data, its contents are NOT overwirtten, but the decompressed data is appended at the end
- if you try to extract a directory, the function will return \c false
*/
- bool ExtractFile(WORD uIndex, CZipMemFile& mf, DWORD nBufSize = 65535);
+ bool ExtractFile(WORD uIndex, CZipMemFile& mf, DWORD nBufSize = 65536);
/**
Open the file with the given index in the archive for extracting.
@@ -604,12 +874,12 @@ public:
the size of the buffer used during extraction
\return \c false if the incorrect action has been taken by
the user or the programmer (it is when #OpenFile or #GetFileInfo returned \c false or \e uBufSize is 0).
- If the file didn't passed the test or there was a disk I/O error, an exception is thrown.
+ If the file didn't passed the test or there was a disk I/O error or the password supplied was incorrect, an exception is thrown.
\note Throws exceptions.
\see SetCallback
*/
- bool TestFile(WORD uIndex, DWORD uBufSize = 65535);
+ bool TestFile(WORD uIndex, DWORD uBufSize = 65536);
/**
Perform the necessary cleanup after an exception was thrown
@@ -657,7 +927,7 @@ public:
because the system may not be able to retrieve information from it.
\return #ExtractFile(WORD , LPCTSTR , bool , LPCTSTR , DWORD ) function. The function takes into account the root path set with #SetRootPath.
\param lpszFileNameInZip
the filename of the file inside the archive (may be \c NULL if lpszNewName is not \c NULL)
- \param lpszFilePath
+ \param lpszPath
\param bFullPath
\param lpszNewName
\return a predicted file path
@@ -1186,13 +1471,15 @@ public:
- #TrimRootPath
- #DeleteFiles
- \note set it before using one of the functions above or leave it as it is by default;
- the default CZipArchive case-sensitivity depends on the system and is set
- as follows:
- - on Windows: \c false
- - on Linux: \c true
-
+
+
\param bCaseSensitive
+ the default CZipArchive case-sensitivity depends on the system and is set
+ as follows:
+ - on Windows: \c false HirNOywtivUoIkqg#Nl5< z)XbDOp!5fAW9!-_)U`5?3qA9T;Jhk3IvzF@SiD_3`_nU3uqVdFVG;Q=70dx`nXD*S z>V38F>#ba$m_eS`ci8mM>HOQ-RBEl!dviW zvq@1K5+z}Qnh%|O&^&G&W(<3ohBzC-NuwfSB4(_(rn3?`xQLsa;M->D$X5WSo~^9B z7=$Jn4SjvMCJ|FpA-#^GZGt>BwyG0YD>rqXCJ~-4w;V+xZ_6x0ha-QZyq-QdGSc2@ zC`{0IPPIV+f~I!9G0`8n;`c8YOl>`=_)WfVo}XhSCG61T!yA`#9%nToDoMOvm}a`X z?>jz4^@fp)*~n0~_-;6ec@pJ&Vq;Z69NhE4%AfFA@frw!gVRK#9Gu-Qtu*xfCS3r7 zPTY^N$aAJQP*Y1FNzI}2jhE&IVrt^C9$dmDzV@v*jKc9S1-WHY!mIYe8op+|_i%xD zxmAVN<4 _=jvS&qQCNojP=BCQzX zrsPPMN&=hb?>$m(f%BO6Kg3J4=$7n}-UbO(-7a;1kENj7fGhHv8B;WRxwg-nf{MF&d|13{NTyIk2*KZQsOate~L!=D0(tKihpJ zF?b|F&a($bt^(RQz8@zGjco7E@UXnNNTN?XqhGT$2PU@pMpI8$lngEXC$)F%64-PW zYy&sXe?^vZoD1F02gQVrI4my<;U;DE{6?*Wy$e2y0*SvyK=OuVv$iM(Tv*2hkM!pZ zU1-E`?@yeSLZUd<7a?vJIal==5jv}SkS0)}ZI$LW$S@vWg)Vobaq7=H5&a3=?9>ae zZSZlyyAp8Txe_*(<}GnVVd46P%D1cPy#Gmyl4` z=*kFYr%LW~^Zoua7GC!m(JnrAkT&ivVugGp4UrIp7|3+QJ&4cfq0;3xZC&HIVB6Y- z!=Ql@@~cFu1>=lf+O2B8zgp#UjuZaAA%ndrvUN#6zp*^7jRD!G8PS8yz)zT`m*jQ> zM;#tuJP-7YTI?#acx=8RbV;H%g>1}t>zhz{c)<`FJI7?(Zh@$_Kk659MKLl94lr zR2l{wv%iFtFDR#Kp+lB>4{!zSVzl-@jOXl6f+h0}Dwg7zS0TBh5mlg{sDxv=zqYyu z*%PMA`#6$*4`drOz9D2&0q?^-HoB(_9IXO1s -Q: In CZipArchive::AddNewFile and CZipArchive::ExtractFile I want to use partial +Q: In %CZipArchive::AddNewFile and %CZipArchive::ExtractFile I want to use partial path for the filename inside the archive. @@ -53,7 +53,7 @@ Q: I want to create an archive that will be readable under Unix/Linux.whmh#m6_vx$)
k1vkQPj8ZjEOp|@Yww|WSvtf8atClo&qble7%yz!Mo(X zVQau-gA4b`MWt1VO6$lq=tuz1_yNkX&aCpvqDgG3gI{`I_L-l2BUQ*`Q~(_fveZx= zG)B4_dSB32ItBRv_%XULGj)SZCt)P?AH;p`yr>7&3%nSvJg;b|bJ7L`)fi<=ikv SlSfYa4*?tPUH)66CZBU1QyJW#ny145L%(;x}E-w5uYVrvM zTIOb|)PL%;xnwAd=66cjJum~^T&P4>!NFcGsy%etrGXwBLLYuKkeu&&U=vabBYNtS z@TXkF2wnJ9Bd>c_eEBha**=L$;#N0o$!3SB!!RXqq>%dqhDnjtxAH9t8U?>A27l}+ zeAPK~#zb z)u)KnWV#{X%LshgBN-%A&igmgNhrpto}BA*g4YW?KE>v1HaOAQ#^U5dw1qdGeLsSq zMo(~mCp!C7bLJLS(cUsd005E#0D$|;5zRpkKo+ZLJ$;SkK}=ue@=LPED*YB72uNiK zS$O?{#en+_Bn#)EJt=B^O8rO{BWrB7I?-2`yM2y$i<%#Z$)4>82g}zkF;@ W&!aNzJGHp&f34>fa_aoWzx$RQ!2WtIK`Z=6R5Lm5Xc&Mru19jkgEiwaD zn>isII`eZ2dyiH#7C=TF%fW9vzSiA8g`XA@uOpA3>m56vrwCA3M?tb(+Pvt5!8E^w zgyFPIAzR|ARQnC#gQ~g$s2tyvp>w;xJwc-)M)#0wD`3<_l|gjM1rXT&8dw>W{z1Dj zm1H$`igx8`XK>w4)`_AArcLIXi#R5+m~_XW$wtwLQ>yVWN|klo6)&e?_}Kh8GZqkQ z6KI@GEye0s^l-Q|Yiw%*lMkGPKQ<#ab_pZG_J&Y<^g{U|Hj7;D8j*r>Sj+HOdx)J5 zzvQ}fzY|7m{9!?{z>&FeMjyqB$&3OCyJNodN9Ew @@ -44,7 +44,7 @@ Q: Why the library doesn't want to extract archives (mostly old)?lnrvRcaue@AH>4snz;A^kF)h=3CO zi)haWbl*M~ hYvQVP4nM=Sv TyYVkJ_xHCa^=!OK%dEEZlfyp!+Ert9>!KNr?sdIR#GmLR8&*g3A-jy zNY#PFB`Y(o2A0ujsK;z7Iqi0))2CRETv@$5Hg;3>n&etrC!zOkL|Tnw!0I6K%SN&j z15L5R)2_9Q=glAsUe@r9l^CRJk`+`&!xGgT+HXR%fikptO@c{-1m8waPfX5Bmbe98 zB5EnWTaEV&7JMixQ0Uw8N{*Du;VvQ^aH~#6-a|)7lN2|gy?L-&0ih+;Ol49ddI$HE zpbdmt3?U<{Q7 JQG1j{ ;d|Foox9{ESVi zS?S4~a4-Z8%9td^hpGXs5WH}8s(V)R*QwHPZc4&L<3-w+P7r;xHQblst?C(Y*6z18 zOOUy_l$yJ`JGrRhZG8@Ks7)YvNWkqFaN&el_v{?JUhT{hZBY<9e-KKh2%{y? >!b=lz(NE>S%hEnOt^$kY4Cgy~1?K;?~*+cxN3*3}uo=2rm0U&7mwOZB@1 z3~k&YQNVViFCPlJ`pV?E=IaoT>MmwdKkx#c6=*8wJ3zK5PJ2)#b+L4W%uKKBO&IQC z2NxiR(?(H}Zg$;Bxb9DmE|z#>D!+BF5|TOQ&}1{M{924^Dwp%Dt@ EIJ) DwCtB)dR@C1%h8(qm7Z&T)#gXF@Jjka;VY)O=7A)jyNh^fE3vM09 7pC||=0Pb|68kDp}gld3iAy*gYj6PucK3^CJ^+yx!F>c>L zbEDr6ljqD{w3fY9&DW*+468)ihAF~#xzDAT+<>Xi#a%!v5yz-DlOaQu7?GF}wzhdx zYez0n?oZ+ZDm_pgAz~(_J^)l{V)~+}(5Na%z^*E|;CHDh6@YMP0tPHm2a>>cD7f~B z35L3=cb6{*c3^&|S6BXwx}&f(W;~o^bbtesvLwi#jVx~|FasO7w}+_Ohja*k^F?8s zf-xHQ#Fs4T@YVrNFVo~ gS{YYHx}%fXCkPVk$e z{BB(<{+zB}^}8 _Mi<9(8JZNBJy18Plum zfJ^39=1sf}5XiRubYtZWrD;0c<934Vm{QH!4aQ<+>%-D@Mp8kIBiLO+Y>aJpXBb80 zE~1V}QTQ!7UR5mo?Cw68moUNHWR`)jfX%6d$!!#&+jA>K?RX_MVxOUDJ072J?Vha3 zMvsp)b|hK3*slBoQ8Fgg^=ZN0puVBY=Pf;SSYO)swI3g?Y!F*b6_kPU;BfS5VWHT; zMo?o_0fCYhr%YpDt BpG6%wH``|+-=fhL-e?`e8clROq(m&a zS_Vl`FNfaZd o6EyK9?xty z_jF2GbE!jwz5|V(jNlM3ma*cN)c|VZ-_oP(eN7pk&(WcGv=1D?5S1rhd}?k4aq14k zF|XrYu8)=yt2F9_yj=#%q~R2(EJWuY%fPo=2r)}1CMDvllacq7L9_#BWd;Rof_@UH zxF$H}mCDJuMMSM?;>DC46 k3(jLs=p2HCwMYbZ3j5(}w9O?hVO4SI2v z>Sv-EHU?euyo?HL?DA>k1r`sNY%j%vloX_&?znNBdErYHQAtkgs);K Us|CHFGxem}-g>h1S7m^$4-BY&MkTOcSLOCM&v*I;E$5JY;=^?+sqN#e)Tr1$ z+DX2geepUF*mi)-CKB4f{6becli=~SP(6KD+~k2T$bLGLDsN;V;rg&{Z~mA?l)h@a zYOg&w`0ZDoVPvY8pkV>;$`YbYQRzG|6=N|-9BSU=+IZ#mi)YX88~F|<`cJE#eIQWK zQZwlbpJeV(jy~HXng((|RTF`Oay61y7=rtn9|jP1OHDkqf5gP*5a-eCnL{8yrv}@* zHTnVBD?h-^vNnk~5XS*&xZ2F DIvn)Y`2 zBe7`>6QWphxtE3{8@in!2Xxf|xy-l{e5$zF!piAZs-d+XnbKrAE>Y#A1y(-C+ATcx zgFG*O6IE4!fW!v;-^Jj2q Q: When I open a multi-disk archive (Pkzip mode) and the last disk is not in - the drive, I receive the CZipException::cdirNotFound exception. How to detect + the drive, I receive the %CZipException::cdirNotFound exception. How to detect whether the last disk is in the drive?