2010-09-08 43 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.要清楚的是,上面的代碼並不是這個類的設計工作方式。請不要使用上面的代碼!!!!