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");
答案 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,这意味着系统无法检索下一个文件的信息,因为:
发生这种情况时,任何查询有关当前文件信息的方法(包括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
}