首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查PHP流资源是否可读或可写?

如何检查PHP流资源是否可读或可写?
EN

Stack Overflow用户
提问于 2011-03-14 11:02:33
回答 2查看 17.3K关注 0票数 19

在PHP中,如何检查流资源(或文件指针、句柄或您想要调用它们的任何东西)是否可读或可写?例如,如果您面临这样一种情况,即您对资源是如何打开或创建的一无所知,如何检查它是否可读?如何检查它是否可写?

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

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

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

这个是可能的吗?真的存在这样的东西吗?我一直找不到任何有用的东西。提前感谢你的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-14 11:28:39

很简单。只需从脚本调用stream_get_meta_data($resource),然后检查返回值的mode数组元素:

代码语言:javascript
复制
$f = fopen($file, 'r');
$meta = stream_get_meta_data($f);
var_dump($meta['mode']); // r

如果你想知道底层数据是否可写:

代码语言:javascript
复制
var_dump(is_writable($meta['uri'])); // true if the file/uri is writable
票数 28
EN

Stack Overflow用户

发布于 2011-03-14 11:13:35

好吧,这可能不是最好的解决方案,但我认为它足够了,因为PHP中没有自动完成此操作的功能。

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

代码语言:javascript
复制
$stat = fstat($fp);
$inode = $stat['ino'];
system("find -inum $inode", $result);

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

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

请注意,fileperms()返回一个整数,文档实现了保留前导0(例如0755)的魔术(实际上只是将该整数视为八进制数)。

还要注意的是,文档实现了将该int转换成像-rw-r--r--这样的好字符串的魔力

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5294305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档