Как убедиться, что дескриптор файла был закрыт перед следующей операцией?

#php #while-loop #filehandle

#php #цикл while #дескриптор файла

Вопрос:

Это код, который у меня есть на данный момент, интересно, правильный ли он?

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

Большое вам спасибо!

Комментарии:

1. Чего именно вы пытаетесь достичь? После вызова fclose дескриптор, надеюсь, закрыт, и если это не так, вы ничего не сможете с этим поделать. Для чего вам нужен while ?

2. Мне нужно переименовать файл, а иногда дескриптор файла еще не закрыт. Итак, для следующей операции требуется, чтобы дескриптор был закрыт. Обычно это проблема Windows. Спасибо.

3. Так что на самом деле вместо while я бы предпочел оператор do_this_right_after файл был закрыт.

4. Не знаю никаких подробностей, но, насколько я знаю, fclose() должен блокироваться, пока обработчик действительно не будет закрыт.

5. Согласно этому комментарию (и нескольким другим на той же странице) php.net/manual/en/function.rename.php#102274 кажется, есть небольшая задержка (каким-то образом??) в этих последовательных действиях.

Ответ №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, когда вам нужно. В этом случае цикл не завершится, пока дескриптор не будет закрыт.

Комментарии:

1. но мне интересно, будет ли это ждать, пока дескриптор будет оценен, или он сработает сразу, когда достигнет строки кода. Вы видите, что, похоже, существует задержка между порядком закрытия дескриптора файла и фактическим закрытием файла, поэтому мгновенный запуск кодов иногда не выполняется, когда дескриптор все еще закрывается в конце окна. Спасибо.

2. Один небольшой источник путаницы заключается в том, что закрытый ресурс по-прежнему выглядит как ресурс, если вы var_dump его (отображается как resource(n) of type (Unknown) ), но is_resource возвращает для него значение false. Возможно, вы захотите присвоить дескриптору значение null после закрытия, чтобы избежать путаницы.