【问题标题】:MFC CFindFile::FindNextFile usageMFC CFindFile::FindNextFile 用法
【发布时间】:2011-04-09 22:12:25
【问题描述】:

CFindFile 的文档指出

如果有更多文件,则非零;零 如果找到的文件是最后一个 目录或如果发生错误。 要获取扩展的错误信息, 调用 Win32 函数 GetLastError。 如果找到的文件是最后一个文件 目录,或者如果没有匹配的文件 可以发现,GetLastError 函数返回 ERROR_NO_MORE_FILES。

如果对 FindNextFile 的调用返回相同的值,我如何知道我有 1 个文件还是 0 个文件?

如果找到零个文件,对 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");

【问题讨论】:

    标签: c++ visual-studio-2008 mfc


    【解决方案1】:

    如果没有文件,您对 CFileFind::FindFile 的调用将返回 false。您需要先拨打此电话,然后才能拨打FindNextFile

    【讨论】:

    • 嗯好吧。我正在调用该函数。也许我做错了什么......
    • 当然。第一个日志语句被调用,但第二个(在 if 块中)没有被调用。
    • szFilePath和szDirectory的内容是什么?
    • 等等....抓住你的马。我想我知道它是什么,它与 szDirectory...
    • 缺少双反斜杠 \\ ?
    【解决方案2】:

    文档还指出,如果您从“FindNextFile”获得 0 返回码,则应调用“GetLastError()”以查看它是否等于“ERROR_NO_MORE_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();
    }
    

    但是,他们不是这样设计这个课程的。我想底线是:使用风险自负。

    附:需要明确的是,上面的代码并不是这个类的设计方式。请不要使用上面的代码!!!!

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 2014-05-26
      • 2023-03-16
      • 2020-07-28
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2018-04-19
      相关资源
      最近更新 更多