2013-03-21 71 views
1

注意:由於問題已解決,因此我在原始帖子中添加了評論。何時調用_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的文檔含糊不清。

- 評論:去提高你的英語水平。

預先感謝您。

回答

4

您打給_findclose的電話應該與您撥打_findfirst的電話相匹配 - 即每次撥打_findfirst時,您應該撥打電話_findclose

在上面的代碼中,由於您只有一個呼叫_findfirst,所以只有一個呼叫_findclose是正確的。

如果你正在做遞歸搜索子目錄,然後你想最終當你潛層次多次調用_findfirst,並匹配呼叫_findclose爲您完成並提升備份的層次結構。

+0

確實_findclose需要照顧_findnext? 「http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx」中的聲明使我感到困惑。 – milesma 2013-03-21 03:19:11

+0

@milesma:no - 你調用'_findfirst'一次,然後'_findnext'多次(取決於目錄中的文件數量),然後調用'_findclose'一次。將'_findfirst'想象成真正的'_findopen'可能會有所幫助,這更加明顯的是對_findclose的調用應該與它匹配。 – 2013-03-21 03:20:48

+0

謝謝。我彈出另一個問題。當調用_findfirst(aaa/bbb/*,...)時,哪個文件夾被鎖定?我的調試器顯示系統目錄「。」由fileinfo(第二個參數)返回。 – milesma 2013-03-21 03:47:42

0

當您完成時,您只需要調用_findclose一次。

在Windows上,如果目錄是進程的當前目錄,則該目錄可能被鎖定。嘗試撥打_chdir

如果這不起作用......你打開目錄中的任何文件嗎?打開的文件也可能會鎖定目錄。

Process Explorer看看您的應用可能很有用。它可以確切地告訴你什麼手柄已經打開。

+0

謝謝。我在windows上,我通過_chdir切換目錄,但問題仍然存在。 – milesma 2013-03-21 03:44:27