这里获取指定路径下的所有文件用到了 WIN32_FIND_DATA
下面是WIN32_FIND_DATA的结构
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; //文件创建时间
FILETIME ftLastAccessTime; //文件最后一次访问时间
FILETIME ftLastWriteTime; //文件最后一次修改时间
DWORD nFileSizeHigh; //文件长度高32位
DWORD nFileSizeLow; //文件长度低32位
DWORD dwOID; //文件的对象标识符
TCHAR cFileName[MAX_PATH]; //长文件名
} WIN32_FIND_DATA;
具体实现
直接贴代码了,里面的注释写得很清楚
// strPath 指定的路径
// std::vector<CString >& vecFile 保存读出的文件
// bool bRecursion ture为递归,也就是如果strPath路径下还有文件夹,也一并读取;false为不递归,仅读取strPath路径下的文件
void GetFile(CString strPath, std::vector<CString >& vecFile, bool bRecursion)
{
if (strPath == L"")
return ;
strPath = strPath + _T("\\");
WIN32_FIND_DATA findData;
HANDLE hHandle = ::FindFirstFile(strPath + _T("*.*"), &findData);
//为无效句柄则返回
if (hHandle == INVALID_HANDLE_VALUE)
return ;
do
{ //排除"."和".." "."代表自身文件夹,".."代表上一级文件夹
if (_tcscmp(findData.cFileName, _T(".")) && _tcscmp(findData.cFileName, _T("..")))
{
//如果为文件夹则根据传进来的bool值判断是否递归
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (bRecursion)
GetFile(strPath + findData.cFileName, vecFile, bRecursion);
}
//为文件则直接存入容器
else
{
vecFile.push_back(strPath + findData.cFileName);
}
}
} while (::FindNextFile(hHandle, &findData) != FALSE); //没有找到任何文件或文件夹则跳出循环
::FindClose(hHandle); //关闭文件句柄
}