MFC CFindFile :: FindNextFile用法

时间:2010-09-08 19:11:28

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

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");

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

该文档还指出,如果从“FindNextFile”获得0返回码,则应调用“GetLastError()”以查看它是否等于“ERROR_NO_MORE_FILES”。我仍然不完全清楚0返回代码意味着“我发现了一个文件,因此处理它”,而不是“我没有找到任何文件,所以不要调用其他API,否则你会崩溃。”

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

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

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

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

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

答案 2 :(得分:0)

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
}