调试程序的Debug版本,出现断言框,定位于库文件findfile.cpp 第369行:
void CFileFind::AssertValid() const{ // if you trip the ASSERT in the else side, you've called // a Get() function without having done at least one // FindNext() call if (m_hContext == NULL) ASSERT(m_pFoundInfo == NULL && m_pNextInfo == NULL); else ASSERT(m_pFoundInfo != NULL && m_pNextInfo != NULL); // 第369行}
原程序:
CFileFind finder;if(finder.FindFile(filename)){ CString str = findfile.GetRoot(); // do something ...}
修改后:
CFileFind finder;if(finder.FindFile(filename)){ findfile.FindNextFile(); CString str = findfile.GetRoot(); // do something ...}
正确的调用的次序应该是:FindFile,FindNextFile,GetFileName/GetRoot
扩展:BOOL CFileFind::FindNextFile
BOOL CFileFind::FindNextFile(){ ASSERT(m_hContext != NULL); if (m_hContext == NULL) return FALSE; if (m_pFoundInfo == NULL) m_pFoundInfo = new WIN32_FIND_DATA; ASSERT_VALID(this); void* pTemp = m_pFoundInfo; m_pFoundInfo = m_pNextInfo; m_pNextInfo = pTemp; return ::FindNextFile(m_hContext, (LPWIN32_FIND_DATA) m_pNextInfo);}
以下是MSDN中对于FindNextFile的说明:
Call this member function to continue a file search from a previous call to FindFile.
You must call FindNextFile at least once before calling any of the following attribute member functions:
-
-
GetCreationTime
-
GetFileName
-
GetFileTitle
-
GetFilePath
-
GetFileURL
-
GetLastAccessTime
-
GetLastWriteTime
-
GetLength
-
GetRoot
-
IsArchived
-
IsCompressed
-
IsDirectory
-
IsDots
-
IsHidden
-
IsNormal
-
IsReadOnly
-
IsSystem
-
IsTemporary
-
MatchesMask
-