给定目录,在改目录内及其子目录内搜索一个给定的文件
请问该如何做到?

解决方案 »

  1.   

    CFileFind
    如果还要子目录的话
    就要递归了
      

  2.   

    参数说明:
    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();

    }
    }
    还不明白的话发消息给我吧。
      

  3.   

    void CRecDlg::BrowseFile(CString strFile)
    {
    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();
    }
      

  4.   

    呵呵~~
    看看我的递归算法:
    //如果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());
    }
    }
    }
    }