Introduction
This is a small dialog based multithreaded app which helps us to search inside ZIP archives. It uses the
CZipArchive
class to open and process ZIP archives.
Background
This app uses CZipArchive
class, for more about this CZipArchive
information follow the link
void CZipSearchDlg::EnumerateDirectory(CString Directory)
{
int nCount,i;
CString strFilename;
BOOL bResult;
CFileFind ZIPFiles;
CZipArchive ZIPFile;
CZipFileHeader ZIPFileHeader;
CLike CompareLike;
CString strStatus;
BOOL bDisplayStatus=TRUE;
SHFILEINFO sfi;
LV_ITEM lvItem;struct ItemFile *ifFile;
Directory.TrimLeft();Directory.TrimRight();
if(Directory.Right(1)=="\\")
bResult=ZIPFiles.FindFile(Directory+"*.*");
else
bResult=ZIPFiles.FindFile(Directory+"\\"+"*.*");
while(bResult && !m_bStopEnumeration && !m_bSkipDirectory)
{
if(bDisplayStatus)
{
strStatus.Format("Processing %s",Directory);
m_wndStatusBar.SetText(strStatus,0,0);
bDisplayStatus=TRUE;
}
bResult=ZIPFiles.FindNextFile();
if(!ZIPFiles.IsDots())
if(ZIPFiles.IsDirectory())
{
EnumerateDirectory(ZIPFiles.GetFilePath());
bDisplayStatus=TRUE;
}
else
{
strFilename=ZIPFiles.GetFileName();
strFilename.MakeUpper();
if(strFilename.Right(3)=="ZIP")
{
try
{
ZIPFile.Open(ZIPFiles.GetFilePath());
nCount=ZIPFile.GetNoEntries();
if(nCount>50)
{
strStatus.Format("Processing %s", ZIPFiles.GetFilePath());
m_wndStatusBar.SetText(strStatus,0,0);
m_wndProgressSearch.SetRange(0,nCount-1);
m_wndProgressSearch.ShowWindow(SW_SHOW);
}
for(i=0; i<nCount && !m_bStopEnumeration &&
!m_bSkipDirectory && !m_bSkipFile;i++)
{
if(nCount>10)
m_wndProgressSearch.SetPos(i);
ZIPFile.GetFileInfo(ZIPFileHeader,(WORD)i);
if(CompareLike.IsLike(ZIPFileHeader.GetFileName(),
m_strFilename))
{
SHGetFileInfo(ZIPFileHeader.GetFileName(),
0,&sfi,sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES|SHGFI_SYSICONINDEX|
SHGFI_TYPENAME|
(m_lvResult.GetStyle()&
LVS_ICON?SHGFI_LARGEICON:SHGFI_SMALLICON));
ifFile=new ItemFile;
ifFile->strFilename=ZIPFileHeader.GetFileName();
ifFile->strType=sfi.szTypeName;
if(ifFile->strType.IsEmpty())
if(ifFile->strFilename.ReverseFind('.')>0)
{
ifFile->strType=ifFile->strFilename.Right((
ifFile->strFilename.GetLength() -
ifFile->strFilename.ReverseFind('.'))-1);
ifFile->strType.MakeUpper();
ifFile->strType+=" File";
}
else
ifFile->strType="Unknown";
ifFile->strSize.Format("%u KB",
(ZIPFileHeader.m_uUncomprSize/1024)?
(ZIPFileHeader.m_uUncomprSize/1024):1);
ifFile->strZIPFilename=ZIPFiles.GetFileName();
ifFile->strPath=ZIPFiles.GetRoot();
lvItem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
lvItem.iItem=m_lvResult.GetItemCount();
lvItem.iSubItem=0;
lvItem.iImage=sfi.iIcon;
lvItem.pszText=(LPSTR)ifFile->strFilename.operator LPCTSTR();
lvItem.lParam=(LPARAM)ifFile;
m_lvResult.InsertItem(&lvItem);
}
}
if(nCount>10)
{
m_wndProgressSearch.ShowWindow(SW_HIDE);
bDisplayStatus=TRUE;
}
m_bSkipFile=FALSE;
ZIPFile.Close();
}
catch(...)
{
if(!ZIPFile.IsClosed())
ZIPFile.Close();
}
}
}
}
m_bSkipDirectory=FALSE;
ZIPFiles.Close();
}
Points of Interest
Yes, I learned how to write a multithreaded app and how to process ZIP archives.
History
- ZipSearch Version 1.0 – First Release
Hi everybody, Myself Siva Chandran.P.,doing M.C.A. - IInd year, Also a Microsoft Certified Professinal in Visual Basic 6.0
For futher proceedings or queries con. me
@ "scpmdu [at] yahoo.com"