2010-09-08 96 views
1

为CFindFile的文档指出MFC CFindFile :: FindNextFile使用

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

那么如果我有1个文件或0个文件,如果调用FindNextFile返回相同的值,我该如何知道?

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

回答

4

如果没有文件,你的电话CFileFind::FindFile将返回false。您需要先拨打该号码,然后才能致电FindNextFile

+0

嗯,好的。我正在调用这个函数。也许我在做别的事情...... – 2010-09-08 19:18:08

+0

你能发表一些代码吗? – dwo 2010-09-08 19:19:31

+0

当然。第一个日志语句被调用,但第二个(在if块中)未被调用。 – 2010-09-08 19:27:07

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

但是,这不是他们如何设计这个班。我想底线是:使用风险自负。

P.S.要清楚的是,上面的代码并不是这个类的设计工作方式。请不要使用上面的代码!!!!