给定目录,在改目录内及其子目录内搜索一个给定的文件
请问该如何做到?
请问该如何做到?
解决方案 »
- 64位Windows,注册表变量类型DWORD还是32位吧,它有64位类型的么?
- QQ2010自动发送消息思路
- MFC创建对话框类继承一个添加的CResizingDialog,怎样才能得到下面的代码?
- error LNK2019: unresolved external symbol __imp__InitCommonControls@0 referenced in function大家帮忙看一下 谢谢
- __stdcall与 __declspec(dllexport)
- 如何在自己创建的窗口里滚动显示信息?
- 请帮忙!(100分)
- 错误在那里???快救我
- 谁能告诉我如何做网线的水晶头?各线顺序怎样?
- 哪里有侯捷的 深入浅出MFC的完整的配书代码下载?
- 求一个Edit.
- listctrl上item显示图标的问题,朋友们帮忙看看。
如果还要子目录的话
就要递归了
pszDir 为你要指定查找的目录。例如D:\\games\\ (注意是\而不是\\)
SpszDir 为指定把查找目录下的所有文件的信息(文件名,和文件大少)。例如D:\\games.lis
#define MYMAX_PATH 192
Dir_A_S(LPCSTR pszDir,LPCSTR SpszDir) //遍历文件夹函数
{
WIN32_FIND_DATA ffd ;
char szDirFile[MYMAX_PATH];
//int i;
FileInfo fileinfo;
CString filename;
CFile fsl; //确保SpszDir文件的存在
FILE* fp=NULL;
if((fp=fopen(SpszDir,"r"))==NULL)
{fsl.Open(SpszDir, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);fsl.Close();fsl.Open(SpszDir,CFile::modeWrite | CFile::typeBinary | CFile::shareDenyNone);}
else {fsl.Open(SpszDir,CFile::modeWrite | CFile::typeBinary | CFile::shareDenyNone);fsl.Seek(0,CFile::end);fclose(fp);}
sprintf(szDirFile,"%s*",pszDir);
HANDLE hFind = FindFirstFile(szDirFile,&ffd);
if (hFind != INVALID_HANDLE_VALUE)
{
char szDir[MYMAX_PATH];
if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,".."))
{//确定找到一个目录并且不为 . 或 ..
sprintf(szDir,"%s%s\\",pszDir,ffd.cFileName);
Dir_A_S(szDir,SpszDir);
}
while(FindNextFile(hFind,&ffd))
{
if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,".."))
{//确定找到一个目录并且不为 . 或 ..
sprintf(szDir,"%s%s\\",pszDir,ffd.cFileName);
//printf("%s\n",szDir);
Dir_A_S(szDir,SpszDir);
}
if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,"..")) &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,".."))
{
sprintf(szDir,"%s%s",pszDir,ffd.cFileName);
memset(fileinfo.filename, '\0', MYMAX_PATH );
filename=szDir;
filename.Replace("\\","\\\\");
strcpy(fileinfo.filename,filename);
fileinfo.filelonghigh=ffd.nFileSizeHigh;
fileinfo.filelonglow=ffd.nFileSizeLow;
fsl.Write(&fileinfo,sizeof(FileInfo));
}
}
FindClose(hFind);
fsl.Close();
}
}
还不明白的话发消息给我吧。
{
CFileFind ff;
CString szDir = strFile;
if(szDir.Right(1) != "\\")
szDir += "\\";
szDir += "*.*";
BOOL res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
CString strPath = ff.GetFilePath();
CString strTitle = ff.GetFileTitle();
if(ff.IsDirectory() && !ff.IsDots())
{
BrowseFile(strPath);
}
else if(!ff.IsDirectory() && !ff.IsDots())
{
CString strPath;
strPath = ff.GetFilePath();
...
}
}
ff.Close();
}
看看我的递归算法:
//如果sPath为目录,就继续检查他的是否仍然有下一级子目录;
void CConvertWord2PDFDlg::AddFolder(LPCTSTR Path, int nType)
{
CString sPath=Path;
AddFiles(Path, nType);
sPath+="*.*";
CFileFind ff;
BOOL bWorking = ff.FindFile(sPath);
if (!bWorking) return;
while (bWorking)
{
bWorking = ff.FindNextFile();
if (ff.IsDots())
continue;
if (ff.IsDirectory()){
CString str=ff.GetFilePath();
str+='\\';
AddFolder(str, nType);
}
}
}//如果sPath为文件,就自动搜索是否符合后缀要求,符合就添加到列表中; 刘贤志01、2、22
void CConvertWord2PDFDlg::AddFiles(CString sPath, int nType)
{
CStringArray Type;
Type.RemoveAll();
if(nType==1)
{
Type.Add ("*.rtf");
}
else if(nType==2)
{
Type.Add ("*.doc");
}
else if(nType==3)
{
Type.Add ("*.html");
Type.Add ("*.htm");
}
int size=Type.GetSize();
for(int i=0;i<size;i++){
CString TmpPath;
TmpPath=sPath;
TmpPath+=Type[i];//加上对文件类型的判断
CFileFind ff;
BOOL bWorking = ff.FindFile(TmpPath);
if (!bWorking && i<size ) continue;
else if(!bWorking && i>=size) return;
while (bWorking)
{
bWorking = ff.FindNextFile();
if (ff.IsDots())
continue;
if (ff.IsDirectory()){
CString str=ff.GetFilePath();
}
if (!ff.IsDirectory()){
AddFiletoList(ff.GetFilePath());
}
}
}
}