Requesting Information
File Information
You can request different types of information about files inside an archive. To
find out about types of information you may retrieve, examine members of the
CZipFileHeader class. To request the
CZipFileHeader
object for a particular file, call one of the following methods:
Filename Conversion
When calling the
CZipFileHeader::GetFileName() method
for the first time, the conversion takes place which converts the filename from
an internal representation to the
CZipString object. This conversion
takes into account filename code pages (see
Unicode Support: Using Non-English Characters in Filenames and Comments)
and directory separators (to match the current platform's default directory separator).
Local Header Information
If you wish to obtain the data that is stored in a local header, you need to make
sure that the local information has been already read before. The local information
is read at the moment when you start extracting a file. If you don't want to extract
a file, but you still want to read the local information, call the
CZipArchive::ReadLocalHeader() method.
The local information can be one of the following:
Sample Code
CZipArchive zip;
zip.Open(_T("C:\\Temp\\test.zip"));
for (ZIP_INDEX_TYPE i = 0; i < zip.GetCount(); i++)
{
CZipFileHeader* info = zip[i];
LPCTSTR name = info->GetFileName();
ZIP_SIZE_TYPE uncomprSize = info->m_uUncomprSize;
ZIP_SIZE_TYPE comprSize = info->m_uComprSize;
zip.ReadLocalHeader(i);
int extraSize = info->m_aLocalExtraData.GetTotalSize();
#ifdef _ZIP64
_tprintf(_T("%I64u: Name: %s Size: %I64u Compressed Size: %I64u\r\n\
Size of Local Extra Data: %d\r\n"),
i, name, uncomprSize, comprSize, extraSize);
#else
_tprintf(_T("%u: Name: %s Size: %u Compressed Size: %u\r\n\
Size of Local Extra Data: %d\r\n"),
i, name, uncomprSize, comprSize, extraSize);
#endif
}
Iterating Over Items
To find out about the number of files in an archive, use the
CZipArchive::GetCount()
method. This method and the
GetSize() and
GetCount() methods
(collections' members) in some implementations, return an unsigned type. To check
the data type used by collections, examine the
ZIP_ARRAY_SIZE_TYPE
definition. You should pay special attention when reverse-iterating over such collections.
The code below represents an
invalid code. If
ZIP_ARRAY_SIZE_TYPE is represented by an unsigned type,
the iteration variable will never be negative and the archive will report an invalid
index when an overflow happens. If the number of items is the maximum value for
the unsigned type, the loop may run forever.
Sample Code
CZipArchive zip;
zip.Open(_T("C:\\Temp\\test.zip"));
ZIP_INDEX_TYPE uMax = zip.GetCount();
for (ZIP_INDEX_TYPE i = uMax - 1; i >= 0; i--)
{
CZipFileHeader info;
zip.GetFileInfo(info, i);
}
zip.Close();
The
correct way for reverse iteration illustrates
the code below.
Sample Code
CZipArchive zip;
zip.Open(_T("C:\\Temp\\test.zip"));
ZIP_INDEX_TYPE i = zip.GetCount();
while (i > 0)
{
i--;
CZipFileHeader info;
zip.GetFileInfo(info, i);
}
zip.Close();
Please pay attention when you use your code in both MFC and STL versions, because
you will use both signed and unsigned types as
ZIP_ARRAY_SIZE_TYPE.
Operations that work on these types and produce negative results will be interpreted
differently in both versions.
When you don't use Zip64 extensions (see
Zip64 Format: Crossing the Limits of File Sizes and Number of Files and Segments),
you can use a signed type (
int) for the file index and volume number types.
Just make sure that
_ZIP_STRICT_U16 is not defined
in
_features.h file.
Archive Information
The ZipArchive Library provides the following methods for requesting archive-related
information:
Predicting Names and Sizes
The ZipArchive Library provides the following methods for predicting names and sizes: