20

PHPで、ストリームリソース(またはファイルポインタ、ハンドル、またはそれらを呼び出したいもの)が読み取り可能か書き込み可能かを確認するにはどうすればよいですか?たとえば、リソースがどのように開かれたか、または作成されたかについて何も知らない状況に直面した場合、どのようにしてリソースが読み取り可能かどうかを確認しますか?そして、それが書き込み可能かどうかをどのように確認しますか?

私が行ったテスト(PHP 5.3.3を使用した通常のテキストファイルのみ)に基づくとfread()、リソースが読み取れない場合でも、どのレベルでもエラーはスローされません。空の文字列を返すだけですが、空のファイルに対してもそれを行います。そして理想的には、リソース自体を変更しないチェックを行う方がよいでしょう。リソースからの読み取りを試みてリソースが読み取り可能かどうかをテストすると、ポインターの位置が変更されます。

逆にfwrite()、リソースが書き込み可能でない場合は、どのレベルでもエラーをスローしません。ゼロを返すだけです。fwrite()これは、ファイルに特定のバイト数を書き込もうとしてゼロを返す場合に、問題が発生したことがわかっているため、少し便利です。しかし、それでも、これは理想的な方法ではありません。書き込みを試みて失敗するかどうかを確認するよりも、書き込みが必要になる前に書き込み可能かどうかを知る方がはるかに優れているからです。

また、理想的には、チェックはファイルだけでなく、あらゆる種類のストリームリソースで機能する必要があります。

これは可能ですか?このようなものはありますか?役に立つものは何も見つかりませんでした。よろしくお願いします。

4

2 に答える 2

29

非常に簡単です。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
于 2011-03-14T03:28:38.710 に答える
1

さて、これは最善の解決策ではないかもしれませんが、PHPにはこれを自動的に行うものがないことを考えると、それで十分だと思います。

最初のステップでは、ファイルからリソースのiノードを取得してから、ファイル名を読み取ります。

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

ファイルハンドルからファイル名を見つけることについてのこの質問から直接引用。

$result(で)ファイル名を取得したので、それに対してを実行fileperms($result)して権限を取得できます。

fileperms()はintを返し、ドキュメントはその先頭の0(0755など)を保持する魔法(実際にはintを8進数として扱う)を実行することに注意してください。

また、ドキュメントはそのintを次のような素敵な文字列に変換する魔法をしていることに注意してください-rw-r--r--

于 2011-03-14T03:13:35.190 に答える