MFC CFindFile :: FindNextFile用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC CFindFile :: FindNextFile用法相关的知识,希望对你有一定的参考价值。

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 settingsusernamedesktop*.lnk");
CString szDirectory = T("C:documents and settingsusernamedesktop");
答案

如果没有文件,您对CFileFind::FindFile的调用将返回false。你需要先调用它才能调用FindNextFile

另一答案

该文档还指出,如果从“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();
}

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

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

另一答案

FindNextFile返回FALSE,表示系统无法检索下一个文件的信息,因为:

  1. 没有更多文件(可能)
  2. 意外的系统错误(不太可能)

发生这种情况时,任何查询当前文件信息的方法(包括IsDot)都将失败。

始终确保在查询有关当前文件的信息之前,FindNextFile返回TRUE。

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;
}

// Always check the result of FindNextFile at every iteration
while(oFindFile.FindNextFile())
{
    if (oFindFile.IsDots())
    {
        continue;
    }

    CString szFileName = oFindFile.GetFilePath();
    pLog->Log(_T("Found file [%s]"), 1, szFileName);
    pVector->push_back(szFileName);
}

// Optional, was there a system error?
DWORD error = ::GetLastError();
if (error != ERROR_NO_MORE_FILES) {
    // Log error for auditing
}

以上是关于MFC CFindFile :: FindNextFile用法的主要内容,如果未能解决你的问题,请参考以下文章

优化使用 MFC FindFile API 失败

VSTO 本地化问题 .Findnext

Excel VBA 使用 .Find 和 .FindNext 查找精确字符串

_findfirst和_findnext

BeautifulSoup 4、findNext()函数

解决Win10下_findnext()异常