COMMON: Use the file cache in ZipArchive::listMembers for performance.

This avoids a new iteration through the .zip file for every listMember call.
Instead it uses the "_hash" HashMap, which already contains all the filenames
and is filled on initializing the ZipArchive by unzOpen.
This commit is contained in:
Johannes Schickel 2012-04-30 00:09:56 +02:00
parent e41e412c9e
commit f23ca8b62b

View file

@ -1463,22 +1463,16 @@ bool ZipArchive::hasFile(const String &name) const {
} }
int ZipArchive::listMembers(ArchiveMemberList &list) const { int ZipArchive::listMembers(ArchiveMemberList &list) const {
int matches = 0; int members = 0;
int err = unzGoToFirstFile(_zipFile);
while (err == UNZ_OK) { const unz_s *const archive = (const unz_s *)_zipFile;
char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; for (ZipHash::const_iterator i = archive->_hash.begin(), end = archive->_hash.end();
if (unzGetCurrentFileInfo(_zipFile, NULL, i != end; ++i) {
szCurrentFileName, sizeof(szCurrentFileName)-1, list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(i->_key, this)));
NULL, 0, NULL, 0) == UNZ_OK) { ++members;
list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(szCurrentFileName, this)));
matches++;
}
err = unzGoToNextFile(_zipFile);
} }
return matches; return members;
} }
const ArchiveMemberPtr ZipArchive::getMember(const String &name) const { const ArchiveMemberPtr ZipArchive::getMember(const String &name) const {