遍历文件有两种方法:
使用的是WinAPI,比较通用的方法就是
void CEMFSOpenFileWnd::FindFiles(LPCWSTR szPath, std::vector<CString>& vecPath)
{
HANDLE hFind(NULL);
WIN32_FIND_DATAW FindFileData;
BOOL bNext = TRUE;
WCHAR FillPath[MAX_PATH];
snsprintf(FillPath,TEXT("%s%s"),szPath,TEXT("\\*.*"));
hFind = FindFirstFileW(FillPath, &FindFileData);
if(hFind != INVALID_HANDLE_VALUE )
{
while(bNext)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(wcscmp(FindFileData.cFileName,L".") == 0|| wcscmp(FindFileData.cFileName,L"..") == 0)
{
bNext=FindNextFileW(hFind, &FindFileData);
continue;
}
else
{
WCHAR szFolder[MAX_PATH];
snsprintf(szFolder,TEXT("%s\\%s"),szPath,FindFileData.cFileName);
FindFiles(szFolder, vecPath);
}
}
else
{
CString str;
str.Format(TEXT("%s\\%s"),szPath,FindFileData.cFileName);
int nIndex=str.ReverseFind('.');
CString str1=str.Mid(nIndex+1);
if(snstrcmp(str1,m_strFilter)==0) //m_strFilter是你要查询的文件类型的后缀名
{
vecPath.push_back(str);
}
}
if(!FindNextFileW(hFind, &FindFileData))
break;
}
FindClose(hFind);
}
}
如果使用的是MFC,则还有一种比较简单的方法
void FindFile(CString strFoldername)
{
CString m_cstrFileList="";
CFileFind tempFind;
BOOL bFound; //判断是否成功找到文件
bFound=tempFind.FindFile(strFoldername + "\\*.*"); //修改" "内内容给限定查找文件类型
CString strTmp; //如果找到的是文件夹 存放文件夹路径
while(bFound) //遍历所有文件
{
bFound=tempFind.FindNextFile(); //第一次执行FindNextFile是选择到第一个文件,以后执行为选择到下一个文件
if(!tempFind.IsDots())
continue; //如果找到的是返回上层的目录 则结束本次查找
if(tempFind.IsDirectory()) //找到的是文件夹,则遍历该文件夹下的文件
{
strTmp="";
strTmp=tempFind.GetFilePath();
FindFile(strTmp);
}
else
{
strTmp=tempFind.GetFileName(); //保存文件名,包括后缀名
// 在此处添加对找到文件的处理
.....
}
}
tempFind.Close();
return;
}
MFC封装好了CFileFind类,很方便我们使用