2011-04-13 56 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

相关问题