64,648
社区成员
发帖
与我相关
我的任务
分享
//这个是循环多级子目录的,效率低一些
/*
现在问题是这样的,
有一个A文件夹, A下可能有四个文件夹a,b,c,d(a,b,c,d名字不确定,也可能只有一个文件夹),在a,b,c,d下有
分别有一个文件(该文件名也不固定),但是文件名中有一部分字符是知道的,例如:a 下有ZZ_090622.txt ,
b下是xx_090623.txt,文件名我是不知道的,但是知道要搜索的文件名中包括的字符串090622和文件后缀。
现在我该怎么快速的搜索到该文件在那个目录下呢?高手指点有高效的算法可再加分。
WIN32_FIND_DATA
FindFirstFile,FindNextFile似乎可以做。但是现在文件夹名字和具体文件名是不知道的。。
本地文件结构
D:\tmp
1
1.txt
2
11_090622.txt
3
11_090623.txt
4
2.txt
*/
#define BASE_PAHT _T("D:\\tmp") //查找根目录
#define FILE_SPE_STR _T("090622") //文件含有的特殊串
//这个函数可以循环查找文件夹,不限于一级
//结果只返回找的的第一个文件的文件夹
TCHAR * FindSpeFilePath(TCHAR * strRoot)
{
TCHAR *pRet = NULL;
TCHAR filePath[260] = {0};
_tcscpy(filePath, strRoot);
_tcscat(filePath, _T("\\*"));
WIN32_FIND_DATA findData;
HANDLE fileHandle;
fileHandle = FindFirstFile(filePath, &findData);
if (fileHandle != INVALID_HANDLE_VALUE)
{
if (_tcscmp(findData.cFileName, _T(".")) != 0 && _tcscmp(findData.cFileName, _T("..")) != 0)
{
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if (_tcsstr(findData.cFileName, FILE_SPE_STR) != NULL) //找到了
{
pRet = new TCHAR[_tcslen(strRoot) + 1];
_tcscpy(pRet, strRoot);
FindClose(fileHandle);
return pRet;
}
}
else
{
TCHAR subFilePath[260] = {0};
_tcscpy(subFilePath, strRoot);
_tcscat(subFilePath, _T("\\"));
_tcscat(subFilePath, findData.cFileName);
pRet = FindSpeFilePath(subFilePath);//文件夹,递归寻找
if (pRet != NULL)
{
return pRet;
}
}
}
while (FindNextFile(fileHandle, &findData))
{
if (_tcscmp(findData.cFileName, _T(".")) != 0 && _tcscmp(findData.cFileName, _T("..")) != 0)
{
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if (_tcsstr(findData.cFileName, FILE_SPE_STR) != NULL) //找到了
{
pRet = new TCHAR[_tcslen(strRoot) + 1];
_tcscpy(pRet, strRoot);
FindClose(fileHandle);
return pRet;
}
}
else
{
TCHAR subFilePath[260] = {0};
_tcscpy(subFilePath, strRoot);
_tcscat(subFilePath, _T("\\"));
_tcscat(subFilePath, findData.cFileName);
pRet = FindSpeFilePath(subFilePath);//文件夹,递归寻找
if (pRet != NULL)
{
return pRet;
}
}
}
}
FindClose(fileHandle);
}
return NULL;
}
//用法
TCHAR * pStr = FindSpeFilePath(BASE_PAHT);
if (pStr != NULL)
{
MessageBox(NULL, pStr, NULL, MB_OK);
delete pStr;
pStr = NULL;
}
//这个是只考录下一级子目录的
//这个函数只查找文件夹下一级子目录中是否含有特定文件
//结果只返回找的的第一个文件的文件夹
TCHAR * FindSpeFilePath2(TCHAR * strRoot)
{
TCHAR *pRet = NULL;
TCHAR filePath[260] = {0};
_tcscpy(filePath, strRoot);
_tcscat(filePath, _T("\\*"));
WIN32_FIND_DATA findData;
HANDLE fileHandle;
fileHandle = FindFirstFile(filePath, &findData);
if (fileHandle != INVALID_HANDLE_VALUE)
{
if (_tcscmp(findData.cFileName, _T(".")) != 0 && _tcscmp(findData.cFileName, _T("..")) != 0)
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//1级目录
{
TCHAR subFilePath[260] = {0};
_tcscpy(filePath, strRoot);
_tcscat(filePath, _T("\\"));
_tcscat(filePath, findData.cFileName);//子目录路径
_tcscpy(subFilePath, filePath);
_tcscat(subFilePath, _T("\\*"));
_tcscat(subFilePath, FILE_SPE_STR);
_tcscat(subFilePath, _T("*"));//组合出类似 D:\tmp\1\*090622* 这样的字符串
WIN32_FIND_DATA findData2;
HANDLE fileHandle2;
fileHandle2 = FindFirstFile(subFilePath, &findData2);
if (fileHandle2 != INVALID_HANDLE_VALUE)
{
pRet = new TCHAR[_tcslen(filePath) + 1];
_tcscpy(pRet, filePath);
FindClose(fileHandle2);
return pRet;
}
}
}
while (FindNextFile(fileHandle, &findData))
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//1级目录
{
TCHAR subFilePath[260] = {0};
_tcscpy(filePath, strRoot);
_tcscat(filePath, _T("\\"));
_tcscat(filePath, findData.cFileName);//子目录路径
_tcscpy(subFilePath, filePath);
_tcscat(subFilePath, _T("\\*"));
_tcscat(subFilePath, FILE_SPE_STR);
_tcscat(subFilePath, _T("*"));//组合出类似 D:\tmp\1\*090622* 这样的字符串
WIN32_FIND_DATA findData2;
HANDLE fileHandle2;
fileHandle2 = FindFirstFile(subFilePath, &findData2);
if (fileHandle2 != INVALID_HANDLE_VALUE)
{
pRet = new TCHAR[_tcslen(filePath) + 1];
_tcscpy(pRet, filePath);
FindClose(fileHandle2);
return pRet;
}
}
}
FindClose(fileHandle);
}
return NULL;
}
//用法
TCHAR *pStr = FindSpeFilePath2(BASE_PAHT);
if (pStr != NULL)
{
MessageBox(NULL, pStr, NULL, MB_OK);
delete pStr;
pStr = NULL;
}
WIN32_FIND_DATA fileinfo;
HANDLE hFind = FindFirstFile(szPath, &fileinfo);
if(hFind == INVALID_HANDLE_VALUE)
return 0;
if((0 == _tcscmp(fileinfo.cFileName, _T(".")) || (0 == _tcscmp(fileinfo.cFileName, _T(".."))))) //当前文件夹或上一级文件夹
//.................................
else if(fileinfo.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) //文件夹
{
CString szSubFolder = szPath;
szSubFolder.Delete(szSubFolder.GetLength()-1, 1);
szSubFolder += fileinfo.cFileName;
szSubFolder += _T("\\");
//......................................................
}
else
// 这是一个文件。
FindNextFile(hFind, &fileinfo) //寻找下一个。