fread和fwrite在不良尝试时不返回false

时间:2014-06-28 12:50:35

标签: php

考虑以下代码:

$a = fopen('test.txt', 'a');
$b = fread($a, filesize('test.txt'));

我希望$b是假的,因为它显然是试图从一个只能写入的文件中读取。但是,$b在这种情况下是一个空字符串。如何区分不良尝试和合法空文件?同样适用于fwrite() btw。

2 个答案:

答案 0 :(得分:0)

根据fread()的定义,除了这两种情况外,它几乎总是返回一个字符串结果值:

  1. 第一个参数不是有效资源,
  2. 长度为零或更小被指定为要读取的字节数。
  3. 在您的情况下,您可以使用以下代码检测到错误的尝试:

    if (($data = fread($f, 512) === '' && !feof($f)) {
        // nothing read but not at EOF either
        // that's fishy
    }
    

    如果是fwrite(),你可以测试写入的字节数(它是返回值);如果写的字节越少,就会出错。

答案 1 :(得分:-1)

$content  = false;
$filename = 'test.txt';

if( $handle = fopen($filename, 'a') )
{
   $meta = stream_get_meta_data($handle);

   // Check if mode readable
   if( $meta['mode'] == 'r')
       $content = fread($handle, filesize($filename));

   fclose($handle);
}

if( $content == false )
    echo 'bad attempt!';

我测试并输出是:

bad attempt!