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 中没有任何东西可以自动执行此操作。

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

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

直接取自这个关于从文件句柄中查找文件名的问题

现在您有了文件名 (in $result),您可以fileperms($result)对其进行操作以获取权限。

请注意,fileperms()返回一个 int,并且文档具有保留前导 0(例如 0755)的魔力(实际上只是将 int 视为八进制)。

另请注意,文档确实具有将该 int 转换为一个不错的字符串的魔力,例如-rw-r--r--

于 2011-03-14T03:13:35.190 回答