2011-04-13 55 views
2

這是我到目前爲止的代碼,我不知道它是否正確?如何在下次操作之前確保文件句柄已關閉?

$handle = fopen($file, 'w') or die("can't open file"); 
$closed = fclose($handle); 
while($closed){ 
    DOAWESOMETHINGS(); // btw I only want to have this run once for each handle 
    $closed = false; 
} 

非常感謝!

+4

你究竟想要完成什麼?在調用'fclose'之後,句柄希望關閉,如果不是,你可以做任何事情。你需要什麼'時間'? – Jon 2011-04-13 13:50:19

+0

我需要重命名文件,有時文件句柄尚未關閉。所以下一個操作需要把手關閉。這通常是一個Windows問題。謝謝。 – Mohammad 2011-04-13 13:52:14

+0

所以實際上,而不是'while'我寧願一個do_this_right_after文件已被關閉的操作符。 – Mohammad 2011-04-13 13:54:22

回答

9

您可以檢查手柄是否已關閉或無法使用本聲明

if(!is_resource($handle)){ 
    //Handle closed 
}else{ 
    //Handle still open 
} 

因此,如果您需要確保FCLOSE已運行下一個功能之前工作過,你可以用這個循環:

while(is_resource($handle)){ 
    //Handle still open 
    fclose($handle); 
} 
do_awesome_things(); 

注意:您還應該使用break;以在需要時結束while循環。在這種情況下,直到手柄關閉,循環纔會結束。

+0

但我不知道這是否會等待句柄被評估,或者它是否會在到達代碼行時觸發。你會發現文件句柄被關閉的順序和被關閉的實際文件之間似乎存在延遲,所以當窗口結束時句柄仍然被關閉時,代碼的瞬時觸發有時無法運行。謝謝。 – Mohammad 2011-04-13 14:07:19

+0

那現在應該沒問題。 – Calum 2011-04-13 14:14:51

+0

混淆的一個小來源是,如果你關閉了'var_dump'(顯示爲類型爲(Unknown)''的resource(n)'),但是'is_resource'確實返回false,那麼封閉資源仍然是資源。您可能想要在關閉後將句柄設置爲null以避免混淆。 – Synchro 2014-09-12 06:10:21

相關問題