2012-08-24 2 views
2

이 기능을 사용하고 있습니다. is_file 및 is_writable은 true를 반환하지만 링크를 해제 할 때 오류가 발생합니다. 이것은 Windows 서버에 있습니다.php 파일이 쓰기 가능하지만 삭제할 수 없습니다.

if(is_file($fileToDelete)) { 
    if(is_writable($fileToDelete)) { 
    unlink($fileToDelete); 
    } 
} 

이 파일은 열어 본 문서입니다. 이 경우에는 is_writable이 false를 반환 할 것이라고 생각했지만 그렇지 않습니다.

그럼 파일을 삭제할 수 있는지 여부를 어떻게 알 수 있습니까?

고맙습니다.

+0

수정 권한이 있습니까? 그것을 마우스 오른쪽 버튼으로 클릭하고 속성을 확인하십시오. –

+0

삭제하기 전에 파일을 닫으십시오. – Musa

+0

예, 파일을 닫으면 PHP에서 제대로 연결 해제 할 수 있습니다. –

답변

4

그 반대의 경우는 어떨까요? 파일을 삭제하고 파일이 실제로 사라 졌는지 확인하십시오.

@unlink($fileToDelete); 

if(is_file($fileToDelete)) { 
    // file was locked (or permissions error) 
} 

이 경우 특정 경우에 실행 가능한지 확실하지 않지만 질문에있는 코드로 판단하면 원하는 결과를 얻을 수 있습니다. 체크 전에 파일을 삭제하지 않는 그들에 대한

+0

감사합니다! 이것은 나의 미숙 함을 보여줄지 모르지만, 함수 호출에 접두사를 붙이는 것은 정확히 무엇을합니까? 다시 한 번 감사드립니다. –

+1

@ user1560676 오류를 표시하지 않습니다. 따라서 링크 해제가 오류를 일으키더라도 표시되지 않습니다. 그러나'@ '를 사용해야하는 몇 가지 경우가 있으며이 중 하나 인 점에 유의하십시오. 또한 [이 질문] (http://stackoverflow.com/questions/12053897/valid-use-cases-for-at-ign-in-php/12053971)을 참조하십시오. 당신이하는 일은 오류를 없애기 위해 은색 총으로 사용하지 마십시오. – PeeHaa

+1

@ user1560676 http://php.net/manual/en/language.operators.errorcontrol.php 오류 억제 연산자입니다. 그것은 php가 그 라인으로부터 파생 된 에러를 무시하도록합니다. 일반적으로 사용하기에 눈살을 찌푸지 만, 이와 같은 합법적 인 용도가 있습니다. –

1

파일을 사용하고 있습니까? fopen ($ file)을 사용하여 파일을 열 었는가?

파일을 삭제하기 전에 fclose ($ file)를 수행하십시오.

+0

호르헤 - 나는이 파일을 PHP에서 사용하지 않을 것이다. 이 파일들은 사용자가 실수로 다시 열려고 시도 할 때 열 수있는 PDF 문서입니다. 그게 내가 파일을 다른 곳에서 열려 있고 php에 의해 삭제할 수없는 경우 확인해야합니다. –

0

이 솔루션은 여기에 있습니다 :

$file = "test.pdf"; 

if (!is_file($file)) { 
    print "File doesn't exist."; 
} else { 
    $fh = @fopen($file, "r+"); 
    if ($fh) { 
     print "File is not opened and seems able to be deleted."; 
     fclose($fh); 
    } else { 
     print "File seems to be opened somewhere and can't be deleted."; 
    } 
} 

간단하고 효율적인.

+0

예를 들어, 파일을 삭제할 수 있는지 여부를 사용자에게 알려주고, 그렇게 할 수있는 옵션을 제공하면 좋을 것입니다. 좋은 게시물. –

관련 문제