在PHP中,如何检查流资源(或文件指针,句柄或您想要调用它们的任何内容)是可读还是可写?例如,如果您遇到的情况是您对资源的打开或创建方式一无所知,那么如何检查它是否可读?你如何检查它是否可写?
根据我所做的测试(只使用PHP 5.3.3的常规文本文件),fread()
在资源不可读时不会在任何级别抛出任何错误。它只返回一个空字符串,但它也为空文件执行此操作。理想情况下,最好选择不修改资源本身的检查。通过尝试从中读取资源来测试资源是否可读将改变指针的位置。
相反,当资源不可写时,fwrite()
不会在任何级别抛出任何错误。它只返回零。这稍微有用一些,因为如果你试图将一定数量的字节写入文件并且fwrite()
返回零,那么你就知道出了问题。但是,这仍然不是一种理想的方法,因为在我需要写入它之前知道它是否可写是更好的,而不是试图写入它并查看它是否失败。
另外,理想情况下,检查应该适用于任何类型的流资源,而不仅仅是文件。
这可能吗?有这样的事吗?我一直找不到任何有用的东西。提前感谢您的回答。
答案 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--