【问题标题】:How to make sure a file handle has been closed before next operation?如何确保文件句柄在下一次操作之前已经关闭?
【发布时间】:2011-04-13 13:47:48
【问题描述】:

这是我目前得到的代码,不知是否正确?

$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;
}

非常感谢!

【问题讨论】:

  • 您到底想完成什么?调用fclose 后,手柄有望关闭,如果没有,您将无能为力。你需要while 做什么?
  • 我需要重命名文件,有时文件句柄还没有关闭。所以接下来的操作需要关闭句柄。这通常是 Windows 问题。谢谢。
  • 所以实际上我宁愿使用 do_this_right_after 文件而不是 while 操作符。
  • 不知道任何细节,但据我所知fclose() 应该阻塞,直到处理程序真正关闭。
  • 根据这条评论(以及同一页面上的其他一些评论)php.net/manual/en/function.rename.php#102274,这些连续操作似乎有一点延迟(不知何故??)。

标签: php while-loop filehandle


【解决方案1】:

您可以使用此语句检查句柄是否已关闭

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 循环。在这种情况下,直到句柄关闭,循环才会结束。

【讨论】:

  • 但我想知道这是否会等待句柄被评估,或者它会在到达代码行时立即触发。您会看到文件句柄被关闭顺序和实际文件被关闭之间似乎存在延迟,因此当句柄仍然在窗口结束时关闭时,代码的瞬时触发有时无法运行。谢谢。
  • 一个小的混淆来源是,如果您 var_dump 关闭的资源似乎仍然是资源(显示为 resource(n) of type (Unknown)),但 is_resource 确实返回 false 。您可能希望在关闭后将句柄设置为 null 以避免混淆。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2014-01-09
  • 2014-10-26
相关资源
最近更新 更多