请问遍历,一个目录树或目录下的文件,并获得文件名,该用哪个函数,谢谢! 给分:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CXGDebug::SearchPath(LPVOID pParam, char* szPathName, SEARCH_PATH_CALLBACK pCallBack){ WIN32_FIND_DATA foundfilename; char szNameBuffer[FILE_NAME_LENGTH]; HANDLE hFoundfile; sprintf(szNameBuffer,"%s\\*.*",szPathName); char szPathFileName[FILE_NAME_LENGTH]; char szCurPath[FILE_NAME_LENGTH]; GetCurrentDirectory(FILE_NAME_LENGTH,szCurPath); if(::SetCurrentDirectory(szPathName)) { hFoundfile=::FindFirstFile(szNameBuffer,&foundfilename); while(INVALID_HANDLE_VALUE!=hFoundfile) { if(!strcmp(".",foundfilename.cFileName)) { if(!::FindNextFile(hFoundfile,&foundfilename)) break; else continue; } if(!strcmp("..",foundfilename.cFileName)) { if(!::FindNextFile(hFoundfile,&foundfilename)) break; else continue; } sprintf(szPathFileName,"%s\\%s", szPathName,foundfilename.cFileName); if(FILE_ATTRIBUTE_DIRECTORY & foundfilename.dwFileAttributes) { //递归遍历子目录 SearchPath(pParam,szPathFileName,pCallBack); } else { //处理文件命 pCallBack(pParam, szPathName, foundfilename.cFileName, szPathFileName, &foundfilename); } if(!::FindNextFile(hFoundfile,&foundfilename)) break; } ::FindClose(hFoundfile); } ::SetCurrentDirectory(szCurPath);}回调函数类型://目录遍历回调函数指针typedef void (*SEARCH_PATH_CALLBACK)(LPVOID pParam, char* szPathName, char* szFileName, char* szPathFileName, WIN32_FIND_DATA* pFileStruct); HANDLE FindFirstFile( LPCTSTR lpFileName, // file name LPWIN32_FIND_DATA lpFindFileData // data buffer);BOOL FindNextFile( HANDLE hFindFile, // search handle LPWIN32_FIND_DATA lpFindFileData // data buffer);DWORD GetFileAttributes( LPCTSTR lpFileName // name of file or directory);BOOL FindClose( HANDLE hFindFile // file search handle);用FindFirstFile查找第一个符合条件的文件/目录,并返回一个Handle,然后用FindNextFile查找所有符合条件的其他文件/目录直到返回FALSE,表示查找结束。可以用GetFileAttributes来判断是文件还是目录。如果需要查找子目录,可以是用递归调用。 初学mfc,对串行化有疑问,想请教高手帮帮小弟!!!!!!!! VC登录窗口怎么修改? 共享内存需要释放吗? 想在桌面加载前加载一个程序,怎么实现 我想你能解决的!!! 请高手帮帮我!!! 如何取得系统中具有焦点的窗口句柄? 高分求解VC与数据库的接口问题 老话题:怎么样学VC(我是初学者,已经入门) 已知BITMAP句柄,如何用CPaintDC画出? 想让CListCtrl中被选中的行与其他行不一样,怎么做? 为什么应用程序窗口左上角的图标不改变?!
char* szPathName,
SEARCH_PATH_CALLBACK pCallBack)
{
WIN32_FIND_DATA foundfilename;
char szNameBuffer[FILE_NAME_LENGTH];
HANDLE hFoundfile;
sprintf(szNameBuffer,"%s\\*.*",szPathName);
char szPathFileName[FILE_NAME_LENGTH];
char szCurPath[FILE_NAME_LENGTH];
GetCurrentDirectory(FILE_NAME_LENGTH,szCurPath);
if(::SetCurrentDirectory(szPathName))
{
hFoundfile=::FindFirstFile(szNameBuffer,&foundfilename);
while(INVALID_HANDLE_VALUE!=hFoundfile)
{
if(!strcmp(".",foundfilename.cFileName))
{
if(!::FindNextFile(hFoundfile,&foundfilename))
break;
else continue;
}
if(!strcmp("..",foundfilename.cFileName))
{
if(!::FindNextFile(hFoundfile,&foundfilename))
break;
else continue;
}
sprintf(szPathFileName,"%s\\%s",
szPathName,foundfilename.cFileName);
if(FILE_ATTRIBUTE_DIRECTORY & foundfilename.dwFileAttributes)
{
//递归遍历子目录
SearchPath(pParam,szPathFileName,pCallBack);
}
else
{
//处理文件命
pCallBack(pParam,
szPathName,
foundfilename.cFileName,
szPathFileName,
&foundfilename);
}
if(!::FindNextFile(hFoundfile,&foundfilename))
break;
}
::FindClose(hFoundfile);
}
::SetCurrentDirectory(szCurPath);
}
回调函数类型://目录遍历回调函数指针
typedef void (*SEARCH_PATH_CALLBACK)(LPVOID pParam,
char* szPathName,
char* szFileName,
char* szPathFileName,
WIN32_FIND_DATA* pFileStruct);
LPCTSTR lpFileName, // file name
LPWIN32_FIND_DATA lpFindFileData // data buffer
);
BOOL FindNextFile(
HANDLE hFindFile, // search handle
LPWIN32_FIND_DATA lpFindFileData // data buffer
);
DWORD GetFileAttributes(
LPCTSTR lpFileName // name of file or directory
);
BOOL FindClose(
HANDLE hFindFile // file search handle
);用FindFirstFile查找第一个符合条件的文件/目录,并返回一个Handle,然后用FindNextFile查找所有符合条件的其他文件/目录直到返回FALSE,表示查找结束。
可以用GetFileAttributes来判断是文件还是目录。如果需要查找子目录,可以是用递归调用。