如何检查PHP流资源是可读的还是可写的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

在PHP中,我该如何检查流资源(或文件指针,句柄或任何你想调用它们的文件)是可读或可写的?例如,如果你遇到了对资源的打开或创建情况一无所知的情况,如何检查它是否可读?你如何检查它是否可写?

基于我所做的测试(仅使用使用PHP 5.3.3的常规文本文件),fread()当资源不可读时,不会在任何级别抛出任何错误。它只是返回一个空字符串,但它也是为一个空文件做的。理想情况下,最好有一个不会修改资源本身的检查。通过尝试读取资源来测试资源是否可读将改变指针的位置。

相反,fwrite()当资源不可写入时,不会在任何级别抛出任何错误。它只返回零。这稍微有用一些,因为如果你试图向文件中写入一定数量的字节并fwrite()返回零,你就知道出了问题。但是,这仍然不是一个理想的方法,因为在我需要写入它之前知道它是否可写,而不是试图写入它并查看它是否失败会好得多。

此外,理想情况下,检查应适用于任何类型的流资源,而不仅仅是文件。

提问于
用户回答回答于

非常简单。只需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
用户回答回答于

好的,所以这可能不是最好的解决方案,但我认为这足够了,因为PHP中没有任何内容可以自动执行此操作。

第一步,将从文件中获取资源的inode,然后读取文件名:

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

现在你已经拥有了文件名($result),你可以fileperms($result)通过它来获得权限。

请注意,fileperms()返回一个int。

另外请注意,该文档将这个int转换为一个漂亮的字符串的魔力 -rw-r--r--

扫码关注云+社区