核心的就是3个函数FindFirstFile, FindNextFile, FindClose;
建议不要使用C\C++的文件函数,那样会有很多很多问题.比如Unicode云云~
FindFirstFile如果想搜索一个文件夹里面的文件,需要在文件夹地址末尾加上"*"
FindNextFile成功的时候返回的是非0.
FindClose是和FindFirstFile一一对应的.FindNextFile不需要调用FindClose;
下面给出一个实例代码,这个代码是我为我的一个软件写的,在有些地方需要说明:
1.函数的第一个参数必须是一个文件夹路径,由于这个是一个核心函数,所以没有使用防御式编程的手动.
2.使用了lstrcpy这样的函数,没有使用Safe String函数.
3.函数的第二个参数是一个回调函数,当找到一个不是文件夹的文件时,会调用此函数.
void findRecurFiles(TCHAR * CurrentFilePath, void (__cdecl *CallBackFindFile)(TCHAR *)) {
WIN32_FIND_DATA FindFileData;
TCHAR TempFilePath[MAX_PATH];
TCHAR TempFilePathNext[MAX_PATH];
lstrcpy(TempFilePath, CurrentFilePath);
lstrcat(TempFilePath, TEXT(\\));
lstrcat(TempFilePath, TEXT("*"));
HANDLE hFind = INVALID_HANDLE_VALUE;
hFind = FindFirstFile(TempFilePath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) return;
do {
if (!(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) {
lstrcpy(TempFilePathNext, CurrentFilePath);
lstrcat(TempFilePathNext, TEXT(\\));
lstrcat(TempFilePathNext, FindFileData.cFileName);
CallBackFindFile(TempFilePathNext);
} else if (FindFileData.cFileName[0] != TEXT('.')) {
lstrcpy(TempFilePathNext, CurrentFilePath);
lstrcat(TempFilePathNext, TEXT(\\));
lstrcat(TempFilePathNext, FindFileData.cFileName);
findRecurFiles(TempFilePathNext, CallBackFindFile);
}
} while (FindNextFile(hFind, &FindFileData)!= 0);
FindClose(hFind);
}
//sample usage
void msgMe(TCHAR * CurrentFilePath) {
MessageBox(NULL, CurrentFilePath, TEXT("OK"), MB_OK);
}
int _tmain(int argc, _TCHAR* argv[])
{
findRecurFiles(TEXT("C:\\"), msgMe);
return 0;
}
No comments:
Post a Comment