注意:由於問題已解決,因此我在原始帖子中添加了評論。何時調用_findclose?
據「http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx」,它說,因爲這:
*您必須調用_findclose您正在使用的_findfirst或_findnext函數(或任何變體)完成之後。這將釋放在你的應用程序中使用這些功能的資源*
--comment:它是模糊的,但什麼微軟想說的是:有些用戶只需要找到的第一個文件(他們不這樣做需要調用_findnext),然後調用_findclose;一些用戶調用_findnext(他們必須已經調用_findfirst),在完成使用後,調用_findclose。實際上_findnext可以多次調用,而_findclose只對由_findfirst創建的句柄負責。
以下是廣泛用於列出目錄中的文件的一段代碼。 - 評論:這是正確的。
例如,如果有2個文件,並在目錄1名的目錄,那麼:
.
..
ddd
file1.txt
file2.txt
_findfirst被調用一次。句柄的相應文件信息是系統目錄「。」。 (是嗎?) - 評論:沒有。句柄是一組文件+目錄,文件信息充當「光標」。 (fileinfo總是包含「name」字段,我敢打賭_findnext的實現是使用「name」來查找句柄指定的一組文件+目錄中的下一個)
_findnext被調用4次。 (第一個參數總是對應於「。」的句柄,是嗎?) --comment: yes + no。第一個參數總是相同的句柄;該句柄不對應於任何文件信息,而是與它們的一組相對應。
我的問題是:
是否 「_findclose」 被調用一次就足夠了? * - 評論: *是的。
如果_findnext不會改變句柄值,它如何「記住」從哪裏開始找到下一個文件(或目錄)? (對不起,也許我在想「鏈接列表」模式)。 * --comment: *我打賭使用fileinfo的名稱字段。就像在Windows資源管理器中一樣,我們對文件夾中的內容進行排序,給定一個文件名,我們可以知道它們在列表中的位置,因此我們可以「查找下一個」。
有沒有什麼傷害呼籲_findclose更多的時間比需要? (像崩潰什麼的) * - 評論: *一個愚蠢的問題。抱歉!
還是下面的代碼錯了?如果是,那麼實施它的正確方法是什麼? - 它是正確的代碼。
// List the files in the directory
intptr_t file;
_finddata_t filedata;
file = _findfirst(desc.c_str(),&filedata);
if (file != -1)
{
do
{
cout << filedata.name << endl;
// Or put the file name in a vector here
} while (_findnext(file,&filedata) == 0);
}
else
{
cout << "No described files found" << endl;
}
_findclose(file);
我問這個,因爲我遇見了一個應用程序被凍結,如果這個過程是活的,不能被刪除的目錄的問題。但是,我可以保證在「_findfirst」的每個返回值上調用「_findclose」。如果我在調用「_findnext」後添加「_findclose」,那麼將完全解決問題。你能幫我解釋一下嗎?
- 評論:赦免。不要使用「保證」太容易。這就是錯誤所在。
注意:我不知道什麼是句柄,如打開文件,讀/寫/讀/寫...,關閉文件句柄。我只是發現描述這三個API的文檔含糊不清。
- 評論:去提高你的英語水平。
預先感謝您。
確實_findclose需要照顧_findnext? 「http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx」中的聲明使我感到困惑。 – milesma 2013-03-21 03:19:11
@milesma:no - 你調用'_findfirst'一次,然後'_findnext'多次(取決於目錄中的文件數量),然後調用'_findclose'一次。將'_findfirst'想象成真正的'_findopen'可能會有所幫助,這更加明顯的是對_findclose的調用應該與它匹配。 – 2013-03-21 03:20:48
謝謝。我彈出另一個問題。當調用_findfirst(aaa/bbb/*,...)時,哪個文件夾被鎖定?我的調試器顯示系統目錄「。」由fileinfo(第二個參數)返回。 – milesma 2013-03-21 03:47:42