之前写过 关于 win32 下磁盘的遍历方法,下面是将里面实现的磁盘遍历函数重新设计了一下,因为磁盘遍历,文件夹遍历在很多时候还是很常见的,为了不修改遍历的函数体,我将处理文件的部分交由一个回调函数去处理,这样的话,你甚至可以把下面的代码写在dll里面,需要进行文件遍历的地方,只要实现一个回调函数传进去就可以了。
函数声明:
// -------------------------------------------------------------------------
// 函数 : ScanDirectory
// 功能 : 遍历一个目录,传入一个函数指针
// 返回值 : BOOL
// 参数 : const TCHAR *pszPath 传入路径
// 参数 : LPSCANDISK_START_ROUTINE lpFunAddress 函数指针回调指针
// 参数 : PVOID lpParam 回调函数参数
// 参数 : BOOL bIsRecur/* = TRUE*/ 是否递归
// 附注 : 回调函数原型 DWORD WINAPI ScanProc(TCHAR *pFilePath, LPVOID lpParameter);
// 回调函数的第一个参数是扫描到一个文件的全名
// -------------------------------------------------------------------------
typedef DWORD (WINAPI *LPSCANDISK_START_ROUTINE)(TCHAR *pFilePath, LPVOID lpParameter);
BOOL ScanDirectory
(const TCHAR *pszPath, LPSCANDISK_START_ROUTINE lpFunAddress, PVOID lpParam, BOOL bIsRecur = TRUE)
函数实现:
// -------------------------------------------------------------------------
// 函数 : ScanDirectory
// 功能 : 遍历一个目录,传入一个函数指针
// 返回值 : BOOL
// 参数 : const TCHAR *pszPath 传入路径
// 参数 : LPSCANDISK_START_ROUTINE lpFunAddress 函数指针回调指针
// 参数 : PVOID lpParam 回调函数参数
// 参数 : BOOL bIsRecur/* = TRUE*/ 是否递归
// 附注 : 回调函数原型 DWORD WINAPI ScanProc(TCHAR *pFilePath, LPVOID lpParameter);
// 回调函数的第一个参数是扫描到一个文件的全名
// -------------------------------------------------------------------------
BOOL ScanDirectory(const TCHAR *pszPath, LPSCANDISK_START_ROUTINE lpFunAddress, PVOID lpParam, BOOL bIsRecur/* = TRUE*/) TCHAR *s = NULL; TCHAR szFileName[MAX_PATH] = TEXT(""); s = szFileName + ::lstrlen(szFileName); hFind = FindFirstFile(szFileName, &fd); ::lstrcpy(s, fd.cFileName); // 如果是文件夹则递归 }while(::FindNextFile(hFind, &fd)); bRet = TRUE;
return bRet; |