奇怪的PHP文件大小行为

时间:2014-07-19 01:49:04

标签: php fopen fwrite filesize fread

在下面的代码中我......

  1. 打开一个文本文件,给它写四个字符,然后再关闭它,

  2. 重新打开它,阅读内容,并使用filesize报告文件大小。 (它应该是4,

  3. 操纵这些内容并添加另外四个字符。然后我将新字符串写入文本文件并再次关闭它,

  4. 再次使用filesize报告文件的大小。

  5. 令我惊讶的是,即使文件的实际大小为8,它给出的答案仍然是4!检查文件的内容证明写入有效,内容的长度为8。

    发生了什么事?

    顺便说一句,我必须使用fread和fwrite而不是file_get_contents和file_put_contents。至少我想我做到了。这个小程序是使用" flock"的一个垫脚石。所以我可以读取文件的内容并重写它,同时确保没有其他进程在其间使用该文件。并且AFAIK flock不能使用file_get_contents和file_put_contents。

    请帮忙!

    <?php
    $filename = "blahdeeblah.txt";
    
    // Write 4 characters
    $fp = fopen($filename, "w");
    fwrite($fp, "1234");
    fclose($fp);
    
    // read those characters, manipulate them, and write them back (also increasing filesize).
    $fp = fopen($filename, "r+");
    $size = filesize($filename);
    echo "size before is: " . $size . "<br>";
    $t = fread($fp, $size);
    $t = $t[3] . $t[2] . $t[1] . $t[0] . "5678";
    rewind($fp);
    fwrite($fp, $t);
    fclose($fp);
    
    // "filesize" returns the same number as before even though the file is larger now.
    $size = filesize($filename);
    echo "size after is: " . $size . "   ";
    
    ?>
    

3 个答案:

答案 0 :(得分:3)

来自http://php.net/manual/en/function.filesize.php

注意:此功能的结果已缓存。有关详细信息,请参阅clearstatcache()

答案 1 :(得分:0)

请注意,缓存的值仅在当前脚本中使用。当您再次运行脚本时,filesize()会读取新的(正确)文件大小。 示例:

$filename='blahdeeblah.txt';

$fp=fopen($filename, 'a');

$size=@filesize($filename);
echo 'Proper size: '.$size.'<br>';

fwrite($fp, '1234');
fclose($fp);

$size=@filesize($filename);
echo 'Wrong size: '.$size;

答案 2 :(得分:0)

通过fopen()函数打开文件时,您可以随时使用fstat()函数获取适当的大小

$fstat=fstat($fp);
echo 'Size: '.$fstat['size'];

示例:

$filename='blahdeeblah.txt';

$fp=fopen($filename, 'a');

$size=@filesize($filename);
echo 'Proper size (obtained by filesize): '.$size.'<br>';

$fstat=fstat($fp);
echo 'Proper size (obtained by fstat): '.$fstat['size'].'<br><br>';

fwrite($fp, '1234');
echo 'Writing 4 bytes...<br><br>';

$fstat=fstat($fp);
echo 'Proper size (obtained by fstat): '.$fstat['size'].'<br>';

fclose($fp);

$size=@filesize($filename);
echo 'Wrong size (obtained by filesize): '.$size;