[译]多线程Zip搜索
By robot-v1.0
本文链接 https://www.kyfws.com/applications/multithreaded-zip-search-zh/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 2 分钟阅读 - 639 个词 阅读量 0[译]多线程Zip搜索
原文地址:https://www.codeproject.com/Articles/5076/Multithreaded-Zip-Search
原文作者:Siva Chandran P
译文由本站 robot-v1.0 翻译
前言
This is an small app which searches inside ZIP archives
这是一个小型应用程序,可在ZIP存档中进行搜索
介绍(Introduction)
CZipArchive
背景(Background)
这个程序使用(This app uses) CZipArchive
类,有关此的更多信息(class, for more about this) CZipArchive
信息点击链接(information follow the link)
- http://www.codeproject.com/cpp/zip.asp?target=zip存档(http://www.codeproject.com/cpp/zip.asp?target=ziparchive) [()^( ) ^
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+"\\"+"*.*");
//Does the recursive search
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())
{
//Calls itself again
EnumerateDirectory(ZIPFiles.GetFilePath());
bDisplayStatus=TRUE;
}
else
{
strFilename=ZIPFiles.GetFileName();
strFilename.MakeUpper();
//Checks whether it is a ZIP file or not.
if(strFilename.Right(3)=="ZIP")
{
try
{
ZIPFile.Open(ZIPFiles.GetFilePath());
nCount=ZIPFile.GetNoEntries();
if(nCount>50)
{
//Updates the statusbar
strStatus.Format("Processing %s", ZIPFiles.GetFilePath());
m_wndStatusBar.SetText(strStatus,0,0);
m_wndProgressSearch.SetRange(0,nCount-1);
m_wndProgressSearch.ShowWindow(SW_SHOW);
}
//Searches inside ZIP file
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";
// If it satisfies the search criteria then obtain the file
// information and it's associated icon
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)
历史(History)
- ZipSearch 1.0版–首次发布(ZipSearch Version 1.0 – First Release)
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
VC7.0 VC7.1 C++ VC6 WinXP Win2003 Win2K MFC Visual-Studio Dev 新闻 翻译