.H 文件
//---------------------------------------------------------------------------
#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 文件
//---------------------------------------------------------------------------
#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;
}