代码之家  ›  专栏  ›  技术社区  ›  Adam Driscoll

MFC CFindFile::FindNextFile用法

  •  1
  • Adam Driscoll  · 技术社区  · 14 年前

    CFindFile的文档说明

    如果有更多文件,则为非零;零 如果发生错误,则返回目录。 目录,或者如果没有匹配的文件 可以找到,GetLastError

    如果没有找到任何文件,对FindFile::GetFilePath()的调用似乎会失败(这会无意中导致我的应用程序崩溃)。

    pLog->Log(_T("Finding files in [%s]"), 1, szFilePath);
    
        if (!oFindFile.FindFile(szFilePath, 0))
    {
        pLog->Log(_T("Failed to find file in directory: [%s]"),1,szDirectory);
        return false;
    }
    
    bool moreFiles = true;
    while(moreFiles)
    {
        moreFiles = oFindFile.FindNextFile();
        if (oFindFile.IsDots())
        {
            continue;
        }
    
        CString szFileName = oFindFile.GetFilePath();
        pLog->Log(_T("Found file [%s]"), 1, szFileName);
        pVector->push_back(szFileName);
    }
    return true;
    

    编辑

    CString szFilePath = _T("C:\documents and settings\username\desktop\*.lnk");
    CString szDirectory = T("C:\documents and settings\username\desktop");
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   dwo    14 年前

    如果没有文件,请拨打 CFileFind::FindFile FindNextFile .

        2
  •  2
  •   Dave    11 年前

    该文档还指出,如果从“FindNextFile”得到0返回代码,则应调用“GetLastError()”以查看它是否等于“ERROR\u NO\u MORE\u FILES”。我仍然不完全清楚0返回代码的意思是“我又找到了一个文件,所以处理它”,而不是“我没有找到任何文件,所以不要调用其他API,否则会崩溃。”

    我认为微软需要重新考虑这个类,“1”表示我找到了一个文件,“0”表示我没有找到一个文件。然后,代码可以这样写:

    (免责声明:请勿使用此代码!这是错误的!每次跳过一个文件!)

    CFileFind cff;
    if ( cff.FindFile(_T("*.*")) )
    {
        while ( cff.FindNextFile() )
        {
            // Use the API's here without fear of crashing...
        }
        cff.Close();
    }
    

    但是,这不是他们设计这门课的方式。我想底线是:使用风险自负。

    顺便说一句,上面的代码并不是这个类的设计目的。请不要使用以上代码!!!!