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

jnr*_*bsn 18 php fopen fwrite fread

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

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

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

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

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

irc*_*ell 26

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

$f = fopen($file, 'r');
$meta = stream_get_meta_data($f);
var_dump($meta['mode']); // r
Run Code Online (Sandbox Code Playgroud)

如果您想知道基础数据是否可写:

var_dump(is_writable($meta['uri'])); // true if the file/uri is writable
Run Code Online (Sandbox Code Playgroud)

  • @Jon:[根据源代码](http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/main/streams/plain_wrapper.c?revision=308011&view=markup),是的完全是详尽无遗的.(该文件中的第56行,因为你不太了解C)... (3认同)
  • `该流可以是由fopen(),fsockopen()和pfsockopen()创建的任何流。`对使用fwrite打开的文件不起作用?害怕吗?在某些情况下比我的解决方案要好,在其他情况下则要差得多。。。我是个白痴。 (2认同)