view plaincopyprint?
//---------------------------------------------------------------------------
#ifndef SearchFilesUnitH
#define SearchFilesUnitH
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
typedef void(__stdcall *PSEARCHCALLBACK)(LPCTSTR);
typedef void(__stdcall *PDIRCOMPLETEDCALLBACK)(LPCTSTR);
class CSearchFile
{
public:
// 無深度初始化構造函數,此時掃描深度不受限制
CSearchFile()
{
m_depthLevel = -1;
}
// 掃描深度初始化構造函數
CSearchFile(int depthLevel)
{
m_depthLevel = depthLevel;
}
private:
int m_depthLevel;
private:
BOOL DirectoryExist(LPCTSTR lpszDir)
{
DWORD dwAttribute = ::GetFileAttributes(lpszDir);
if (dwAttribute != 0xFFFFFFFF)
{
return ((dwAttribute & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
}
return FALSE;
}
public:
BOOL SearchFile(
LPCTSTR root /* 搜索文件的根目錄 */
, PSEARCHCALLBACK pFoundCallback /* 文件搜到後的 Callback
在此Callback中可以實現
文件類型的過濾,文件刪除,復制等等
與文件相關的操作
*/
, PDIRCOMPLETEDCALLBACK pDirCompletedCallback /* 完成一個子目錄後的 Callback
在此Callback中可以配合上個Callback
的文件刪除功能,刪除文件夾
*/
, int depthLevel = 0
);
};
#endif
.cpp 文件
[cpp]view plaincopyprint?
//---------------------------------------------------------------------------
#include "SearchFilesUnit.h"
//---------------------------------------------------------------------------
BOOL CSearchFile::SearchFile(
LPCTSTR root /* 搜索文件的根目錄 */
, PSEARCHCALLBACK pFoundCallback /* 文件搜到後的 Callback
在此Callback中可以實現
文件類型的過濾,文件刪除,復制等等
與文件相關的操作
*/
, PDIRCOMPLETEDCALLBACK pDirCompletedCallback /* 完成一個子目錄後的 Callback
在此Callback中可以配合上個Callback
的文件刪除功能,刪除文件夾
*/
, int depthLevel
)
{
char szPath[MAX_PATH] = {0};
WIN32_FIND_DATA stWFD;
memset(&stWFD, 0, sizeof(WIN32_FIND_DATA));
sprintf(szPath, "%s\\*", root);
// 如果有掃描深度控制
if (m_depthLevel > 0)
{
if (depthLevel++ > m_depthLevel)
{
depthLevel = 0;
return FALSE;
}
}
HANDLE file = ::FindFirstFile(szPath, &stWFD);
if (INVALID_HANDLE_VALUE == file) return FALSE;
do
{
if (strcmp(stWFD.cFileName, ".") && strcmp(stWFD.cFileName, ".."))
{
char szFoundFile[MAX_PATH] = { 0 };
sprintf(szFoundFile, "%s\\%s", root, stWFD.cFileName);
// 判斷是目錄還是文件
if (DirectoryExist(szFoundFile))
{
SearchFile(szFoundFile, pFoundCallback, pDirCompletedCallback, depthLevel);
}
if (NULL != pFoundCallback)
{
pCallback(szFoundFile);
}
}
}while (::FindNextFile(file, &stWFD));
::FindClose(file);
if (NULL != pDirCompletedCallback)
{
pDirCompletedCallback(root);
}
return TRUE;
}