2011-04-13 2 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'를 호출 한 후에는 핸들이 잘 닫히고, 그렇지 않으면 아무것도 할 수 없습니다. 'while '이 필요한 이유는 무엇입니까? – Jon

+0

파일의 이름을 변경해야하며 파일 핸들이 아직 닫혀 있지 않은 경우도 있습니다. 따라서 다음 작업에서는 핸들을 닫아야합니다. 이것은 대개 Windows 문제입니다. 고맙습니다. – Mohammad

+0

그래서 실제로'while' 대신 do_this_right_after 파일이 닫힌 연산자를 선호합니다. – Mohammad

답변

9

당신은,이 루프를 사용할 수 FCLOSE 다음 기능을 실행하기 전에 근무하고 확인해야하는 경우는, 핸들이 종료되었는지 여부를 확인하거나

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

따라서이 문을 사용 할 수 없습니다

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

참고 : 필요할 때 루프를 종료하려면 break;도 사용해야합니다. 이 경우 루프는 핸들이 닫힐 때까지 끝나지 않습니다.

+0

하지만이 핸들을 평가할 때까지 기다릴 지 또는 코드 줄에 도달하면 바로 실행되는지 궁금합니다. 파일 핸들이 닫히는 순서와 실제 파일이 닫히는 사이에 지연이있는 것 같아서 코드의 순간적 실행은 핸들이 여전히 윈도우의 끝에서 닫혀있을 때 때때로 작동하지 않습니다. 고맙습니다. – Mohammad

+0

아니야 이제 괜찮을거야. – Calum

+0

작은 혼란의 한 가지 원인은 닫힌 리소스가 리소스를 'var_dump'('유형 (알 수 없음)의 리소스 (n)'으로 표시)하지만 여전히 'is_resource'가 false를 반환하면 여전히 리소스로 보입니다. 혼동을 피하기 위해 닫은 후에 핸들을 null로 설정할 수 있습니다. – Synchro