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,表示系统无法检索下一个文件的信息,因为:
- 没有更多文件(可能)
- 意外的系统错误(不太可能)
发生这种情况时,任何查询当前文件信息的方法(包括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用法的主要内容,如果未能解决你的问题,请参考以下文章