void CZipCentralDir::ReadHeaders() { if (!m_pStorage->IsBinarySplit()) m_pStorage->Seek(m_pInfo->m_uOffset); else m_pStorage->SeekInBinary(m_pInfo->m_uOffset, true); RemoveHeaders(); //just in case for (ZIP_INDEX_TYPE i = 0; i < m_pInfo->m_uEntriesNumber; i++) { CZipFileHeader* pHeader = new CZipFileHeader(this); m_pHeaders->Add(pHeader); if (!pHeader->Read(true)) ThrowError(CZipException::badZipFile); } if (m_specialFlags.IsSetAny(CZipArchive::sfExhaustiveRead)) { ZIP_FILE_USIZE uPosition = m_pStorage->GetPosition(); // different offset, or different parts if (uPosition != m_pInfo->m_uEndOffset || (m_pStorage->IsSegmented() && !m_pStorage->IsBinarySplit() && m_pStorage->GetCurrentVolume() != m_pInfo->m_uLastVolume)) for(;;) { CZipAutoBuffer buf(4); m_pStorage->Read(buf, 4, true); if (!CZipFileHeader::VerifySignature(buf)) break; CZipFileHeader* pHeader = new CZipFileHeader(this); m_pHeaders->Add(pHeader); if (!pHeader->Read(false)) ThrowError(CZipException::badZipFile); } } // this is necessary when removing data descriptors, CZipArchive::MakeSpaceForReplace, deleting, replacing or encrypting files // sort always, to yield the same results in requesting files by index regardless of the reason for opening m_pHeaders->Sort(CompareHeaders); RebuildFindFastArray(); }
void CZipCentralDir::ReadHeaders() { m_pStorage->m_pFile->Seek(m_info.m_uOffset + m_info.m_uBytesBeforeZip, CZipAbstractFile::begin); RemoveHeaders(); //just in case for (int i = 0; i < m_info.m_uEntriesNumber; i++) { CZipFileHeader* pHeader = new CZipFileHeader; m_headers.Add(pHeader); if (!pHeader->Read(m_pStorage)) ThrowError(CZipException::badZipFile); ConvertFileName(true, true, pHeader); } SortHeaders(); // this is necessary when deleting files and removing data descriptors if (m_bFindFastEnabled) BuildFindFastArray(m_bCaseSensitive); }