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

时间:2011-03-14 03:02:33

标签: php fopen fwrite fread

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

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

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

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

这可能吗?有这样的事吗?我一直找不到任何有用的东西。提前感谢您的回答。

2 个答案:

答案 0 :(得分:25)

非常简单。只需从脚本中调用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 :(得分:1)

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

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

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

直接来自this question about finding the filename from a filehandle

现在您已拥有文件名(在$result中),您可以在其上执行fileperms($result)以获取权限。

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

另请注意,该文档将将该int转换为像-rw-r--r--

这样的好字符串