Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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);
}