2011-03-14 3 views
17

PHP에서 스트림 리소스 (또는 파일 포인터, 핸들 또는 원하는 모든 호출)가 읽기 또는 쓰기 가능한지 확인하려면 어떻게해야합니까? 예를 들어 리소스가 열리거나 생성 된 방법에 대해 알지 못하는 상황에 직면 한 경우이를 읽을 수 있는지 어떻게 확인합니까? 쓰기가 가능한지 어떻게 확인합니까?PHP 스트림 리소스가 읽기 가능하거나 쓰기 가능한지 확인하는 방법은 무엇입니까?

내가 수행 한 테스트 (PHP 5.3.3을 사용하는 일반 텍스트 파일 만 사용)에 따라 fread()은 리소스를 읽을 수 없을 때 어떤 수준의 오류도 발생시키지 않습니다. 빈 문자열 만 반환하지만 빈 파일의 경우에도 그렇게합니다. 그리고 이상적으로는 리소스 자체를 수정하지 않는 검사를하는 것이 좋습니다. 읽기를 시도하여 자원을 읽을 수 있는지 테스트하는 것은 포인터의 위치를 ​​변경합니다.

반대로, fwrite()은 리소스에 쓸 수없는 경우 어떤 수준의 오류도 발생시키지 않습니다. 그냥 0을 반환합니다. 파일에 특정 수의 바이트를 쓰려고 시도하고 fwrite()이 0을 반환하면 뭔가 잘못되었음을 알게되므로 약간 더 유용합니다. 하지만 여전히 이상적인 방법은 아닙니다. 필기 쓰기 전에 쓰기가 가능한지 알아야 쓰기가 어려워 지는지 확인하는 것이 훨씬 낫습니다.

또한 이상적으로는 파일뿐만 아니라 모든 종류의 스트림 리소스에서 작동해야합니다.

이것이 가능합니까? 이것과 같은 것이 존재합니까? 나는 유용한 것을 찾을 수 없었다. 귀하의 답변에 미리 감사드립니다.

+0

, 모두 [' fread()'] (http://php.net/fread)와 ['fwrite()'] (http://php.net/fwrite) 각각의 문서 페이지에 따라 실패하면'bool (false)'를 반환한다. ....하지만 PHP 5.3.5에서는 발생하지 않습니다. –

답변

24

아주 간단한 -rw-r--r-- 같은 좋은 문자열로 그 INT 변환의 마법을 않습니다. 그냥 스크립트에서 stream_get_meta_data($resource)를 호출하고 반환 값의 mode 배열 요소 확인 :

$f = fopen($file, 'r'); 
$meta = stream_get_meta_data($f); 
var_dump($meta['mode']); // r 

을 그리고 기본 데이터를 쓸 경우 당신이 알고 싶은 경우 :

물론
var_dump(is_writable($meta['uri'])); // true if the file/uri is writable 
+1

'스트림은 fopen(), fsockopen() 및 pfsockopen()에 의해 생성 된 모든 스트림이 될 수 있습니다. 'fwrite로 열린 파일은 작동하지 않습니까? fread? 어떤 경우에는 내 솔루션보다 낫지 만 다른 것들은 훨씬 더 나빠질 것입니다 ** ** 편집 ** 마음대로, 자유롭고 쓸모있는 USE 핸들을 fopen이 열었습니다. 나는 바보 야. – rockerest

+1

@rock :'fwrite' 또는'fread'로 파일을 열 수 없습니다. 이러한 함수는 열린 스트림에서만 작동합니다. 이 함수는 PHP의 모든 스트림 리소스에서 작동합니다. 그래서 나는 그것이 얼마나 많이, 훨씬 더 나쁠 수 있는지를 보지 못한다. 실제로 이것은 100 % 플랫폼에 독립적이며 스트림 래퍼에서도 작동합니다. 그래서 그것은 실제로 올바른 해결책입니다 ... – ircmaxell

+0

나는 이것을 좋아할 것 같아요. 매뉴얼의 ['fopen()'페이지 (http://www.php.net/manual/en/function.fopen.php)에있는 모드 표가 완전히 철저한 목록인지 알고 있습니까? – jnrbsn

1

그래,이게 최선의 해결책은 아닐지 모르지만, PHP에서 자동으로이 일을 처리하는 데는 아무 것도 없다는 점을 감안하면 충분하다고 생각합니다.

는 첫 번째 단계의 경우, 파일에서 자원의 아이 노드를 취득하고 파일 이름을 읽을 수 있습니다 : this question about finding the filename from a filehandle에서 직접 찍은

$stat = fstat($fp); 
$inode = $stat['ino']; 
system("find -inum $inode", $result); 

합니다.

파일 이름이 ($result) 이니까 fileperms($result)을 사용하여 권한을 확보 할 수 있습니다.

fileperms()은 int를 반환하며 문서는 해당 선행 0 (예 : 0755)을 유지하는 마법 (사실 8 진수로 int를 8 진수로 처리)을 수행합니다.

는 또한 문서

+0

리소스가 먼저 파일이라고 가정합니다. 소켓 일 수도 있고,'php : // stdin' 일 수도 있습니다. –

+0

... 그리고 시스템은 * nix입니다. 어떤 수단으로도 완벽하지는 않지만 PHP가 할 수있는 최선의 방법입니다. – rockerest

+0

파일이 쓰기 가능할 수도 있지만 파일 핸들은 읽기 전용입니다.그래도 꽤 똑똑합니다. – Charles

관련 문제