您的位置:首页 > 其它

遍历某路径的函数 ---- 将路径下 所有的文件保存在全局容器中,以待近一步处理

2011-11-23 09:53 453 查看
// 全局容器 存放所有查到的文件路径

std::vector <CString> g_xmlFilePath;


// 执行完毕后,路径下所有的xml文件路径 都保存在全局容器g_xmlFilePath中了

FindFileInDir(CString filePath)
{

std::vector <CString> directoryPath;

CString subfilePathtemp;
CString subFilePath;

WIN32_FIND_DATA fd;
ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));

HANDLE hSearch;

if (filePath.Right(1)!=_T("\\"))
{
filePath+=_T("\\");
}

filePath+=_T("*");
hSearch=::FindFirstFile(filePath,&fd);

if(INVALID_HANDLE_VALUE==hSearch)
{
AfxMessageBox(L"请正确选择文件夹");
return;
}

subFilePath=filePath.Left(filePath.GetLength()-1);
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM)&&!(fd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) && _tcscmp((const TCHAR *)&fd.cFileName, L".") && _tcscmp((const TCHAR *)&fd.cFileName, L"..")&&_tcscmp((const TCHAR *)&fd.cFileName,L"RECYCLER")&&_tcscmp((const TCHAR *)&fd.cFileName,L"System Volume Information"))   //文件夹
{

subfilePathtemp=subFilePath+fd.cFileName;;
directoryPath.push_back(subfilePathtemp);//  将目录放大局部容器变量中

}else{

subfilePathtemp=fd.cFileName;
int dotPosition=subfilePathtemp.ReverseFind(L'.');
subfilePathtemp=subfilePathtemp.Right(subfilePathtemp.GetLength()-dotPosition-1);

if (subfilePathtemp.Compare(L"xml")==0)
{
subfilePathtemp=subFilePath+fd.cFileName;
g_xmlFilePath.push_back(subfilePathtemp); // 将所查到文件放入全局容器变量中, 这样遍历完所有文件夹后,所有的文件路径都存放在了全局容器中
}
}

BOOL bFinished=FALSE;

while( !bFinished)
{
if(FindNextFile(hSearch, &fd))
{
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM)&&!(fd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) && _tcscmp((const TCHAR *)&fd.cFileName, L".") && _tcscmp((const TCHAR *)&fd.cFileName, L"..")&&_tcscmp((const TCHAR *)&fd.cFileName,L"RECYCLER")&&_tcscmp((const TCHAR *)&fd.cFileName,L"System Volume Information"))   //文件夹
{
subfilePathtemp=subFilePath+fd.cFileName;;
directoryPath.push_back(subfilePathtemp);

}else{

subfilePathtemp=fd.cFileName;
int dotPosition=subfilePathtemp.ReverseFind(L'.');
subfilePathtemp=subfilePathtemp.Right(subfilePathtemp.GetLength()-dotPosition-1);

if (subfilePathtemp.Compare(L"xml")==0)
{
subfilePathtemp=subFilePath+fd.cFileName;
g_xmlFilePath.push_back(subfilePathtemp);;
}
}
}else{

if (GetLastError()==ERROR_NO_MORE_FILES) //正常结束
{
bFinished=TRUE;
}else{

bFinished=TRUE;
}

}
}

FindClose(hSearch); //关闭查找

for (int i=0;i<directoryPath.size();i++) //对每一个路径,递归调用
{
FindFileInDir(directoryPath.at(i));
}
}


改进1:

//-----------------------------------------------------------
//
//  函数名称:FindFileInDir
//
//  参    数:
//    - CString filePath
//
//    - std::vector<CString> &pageVector
//
//  函数作用:搜索路径filePath下的所有指定的文件  将其放置到页容器中
//
//  修改日期:2012年9月12日  By YuJian
//
//-----------------------------------------------------------
void FindFileInDir(CString filePath,std::vector<CString> &pageVector)
{

std::vector <CString> directoryPath;

CString subfilePathtemp;
CString subFilePath;

WIN32_FIND_DATA fd;
ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));

HANDLE hSearch;

if (filePath.Right(1)!=_T("\\"))
{
filePath+=_T("\\");
}

filePath+=_T("*");
hSearch=::FindFirstFile(filePath,&fd);

if(INVALID_HANDLE_VALUE==hSearch)
{
AfxMessageBox(L"请正确选择文件夹");
return;
}

subFilePath=filePath.Left(filePath.GetLength()-1);
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM)&&!(fd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) && _tcscmp((const TCHAR *)&fd.cFileName, L".") && _tcscmp((const TCHAR *)&fd.cFileName, L"..")&&_tcscmp((const TCHAR *)&fd.cFileName,L"RECYCLER")&&_tcscmp((const TCHAR *)&fd.cFileName,L"System Volume Information"))   //文件夹
{

subfilePathtemp=subFilePath+fd.cFileName;;
directoryPath.push_back(subfilePathtemp);//  将目录放大局部容器变量中

}else{

subfilePathtemp=fd.cFileName;
int dotPosition=subfilePathtemp.ReverseFind(L'.');
subfilePathtemp=subfilePathtemp.Right(subfilePathtemp.GetLength()-dotPosition-1);

if (subfilePathtemp.Compare(L"tif")==0)
{
subfilePathtemp=subFilePath+fd.cFileName;
pageVector.push_back(subfilePathtemp); // 将所查到文件放入全局容器变量中, 这样遍历完所有文件夹后,所有的文件路径都存放在了全局容器中
}
}

BOOL bFinished=FALSE;

while( !bFinished)
{
if(FindNextFile(hSearch, &fd))
{
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM)&&!(fd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) && _tcscmp((const TCHAR *)&fd.cFileName, L".") && _tcscmp((const TCHAR *)&fd.cFileName, L"..")&&_tcscmp((const TCHAR *)&fd.cFileName,L"RECYCLER")&&_tcscmp((const TCHAR *)&fd.cFileName,L"System Volume Information"))   //文件夹
{
subfilePathtemp=subFilePath+fd.cFileName;;
directoryPath.push_back(subfilePathtemp);

}else{

subfilePathtemp=fd.cFileName;
int dotPosition=subfilePathtemp.ReverseFind(L'.');
subfilePathtemp=subfilePathtemp.Right(subfilePathtemp.GetLength()-dotPosition-1);

if (subfilePathtemp.Compare(L"tif")==0)
{
subfilePathtemp=subFilePath+fd.cFileName;
pageVector.push_back(subfilePathtemp);;
}
}
}else{

if (GetLastError()==ERROR_NO_MORE_FILES) //正常结束
{
bFinished=TRUE;
}else{

bFinished=TRUE;
}

}
}

FindClose(hSearch); //关闭查找

for (int i=0;i<directoryPath.size();i++) //对每一个路径,递归调用
{
FindFileInDir(directoryPath.at(i),pageVector);
}
}


改进2:

//-----------------------------------------------------------
//
//  函数名称:FindFileInDir
//
//  参    数:
//    - BOOL bSize                          是否判断文件大小
//
//    - CString fileExtention               文件扩展名,不包括‘.’
//
//    - CString filePath                    文件所在的父目录
//
//    - std::vector<CString> &pageVector    保存指定文件的容器
//
//  返    回:void
//
//  函数作用:查找目录filePath下,扩展名为FindFileInDir的所有文件
//
//  修改日期:2012年9月17日  By YuJian
//
//-----------------------------------------------------------
void FindFileInDir(BOOL bSize,CString fileExtention,CString filePath,std::vector<CString> &pageVector)
{

std::vector <CString> directoryPath;

CString subfilePathtemp;
CString subFilePath;

WIN32_FIND_DATA fd;
ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));

HANDLE hSearch;

if (filePath.Right(1)!=_T("\\"))
{
filePath+=_T("\\");
}

filePath+=_T("*");
hSearch=::FindFirstFile(filePath,&fd);

if(INVALID_HANDLE_VALUE==hSearch)
{
AfxMessageBox(L"请正确选择文件夹");
return;
}

subFilePath=filePath.Left(filePath.GetLength()-1);
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM)&&!(fd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) && _tcscmp((const TCHAR *)&fd.cFileName, L".") && _tcscmp((const TCHAR *)&fd.cFileName, L"..")&&_tcscmp((const TCHAR *)&fd.cFileName,L"RECYCLER")&&_tcscmp((const TCHAR *)&fd.cFileName,L"System Volume Information"))   //文件夹
{

subfilePathtemp=subFilePath+fd.cFileName;;
directoryPath.push_back(subfilePathtemp);//  将目录放大局部容器变量中

}else{

subfilePathtemp=fd.cFileName;
int dotPosition=subfilePathtemp.ReverseFind(L'.');
subfilePathtemp=subfilePathtemp.Right(subfilePathtemp.GetLength()-dotPosition-1);

if (subfilePathtemp.Compare(fileExtention)==0)
{
//subfilePathtemp=subFilePath+fd.cFileName;
//pageVector.push_back(subfilePathtemp); // 将所查到文件放入全局容器变量中, 这样遍历完所有文件夹后,所有的文件路径都存放在了全局容器中

if (!bSize)
pageVector.push_back(fd.cFileName);
else
if(fd.nFileSizeLow==466||fd.nFileSizeLow==226)
pageVector.push_back(fd.cFileName);
}
}

BOOL bFinished=FALSE;

while( !bFinished)
{
if(FindNextFile(hSearch, &fd))
{
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM)&&!(fd.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) && _tcscmp((const TCHAR *)&fd.cFileName, L".") && _tcscmp((const TCHAR *)&fd.cFileName, L"..")&&_tcscmp((const TCHAR *)&fd.cFileName,L"RECYCLER")&&_tcscmp((const TCHAR *)&fd.cFileName,L"System Volume Information"))   //文件夹
{
subfilePathtemp=subFilePath+fd.cFileName;;
directoryPath.push_back(subfilePathtemp);

}else{

subfilePathtemp=fd.cFileName;
int dotPosition=subfilePathtemp.ReverseFind(L'.');
subfilePathtemp=subfilePathtemp.Right(subfilePathtemp.GetLength()-dotPosition-1);

if (subfilePathtemp.Compare(fileExtention)==0)
{
if (!bSize)
pageVector.push_back(fd.cFileName);
else
if(fd.nFileSizeLow==466||fd.nFileSizeLow==226)	 //闪电图的大小
pageVector.push_back(fd.cFileName);
}
}
}else{

if (GetLastError()==ERROR_NO_MORE_FILES) //正常结束
{
bFinished=TRUE;
}else{

bFinished=TRUE;
}

}
}

FindClose(hSearch); //关闭查找

for (int i=0;i<directoryPath.size();i++) //对每一个路径,递归调用
{
FindFileInDir(bSize,fileExtention,directoryPath.at(i),pageVector);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: