filesize()总是读取0个字节,即使文件大小不是0字节

时间:2017-02-14 12:06:31

标签: php file

我在下面编写了一些代码,目前我正在测试,因此代码中没有数据库查询。

下面的代码if(filesize($filename) != 0)总是转到else,即使该文件不是0字节并且其中有16个字节的数据。我无处可去,似乎总是认为文件是0字节。

我认为显示我的代码会更容易(可能是其他错误,但我会随着时间的推移检查每个错误,逐个处理它们)。我没有PHP错误或任何东西。

$filename = 'memberlist.txt';
$file_directory = dirname($filename);
$fopen = fopen($filename, 'w+');

// check is file exists and is writable
if(file_exists($filename) && is_writable($file_directory)){

    // clear statcache else filesize could be incorrect
    clearstatcache();

    // for testing, shows 0 bytes even though file is 16 bytes
    // file has inside without quotes:   '1487071595 ; 582'
    echo "The file size is actually ".filesize($filename)." bytes.\n";

    // check if file contains any data, also tried !==
    // always goes to else even though not 0 bytes in size
    if(filesize($filename) != 0){

        // read file into an array
        $fread = file($filename);

        // get current time
        $current_time = time();

        foreach($fread as $read){
            $var   = explode(';', $read);
            $oldtime  = $var[0];
            $member_count = $var[1];
        }
            if($current_time - $oldtime >= 86400){
                // 24 hours or more so we query db and write new member count to file
                echo 'more than 24 hours has passed'; // for testing

            } else {
                // less than 24 hours so don't query db just read member count from file
                echo 'less than 24 hours has passed'; // for testing
            }
    } else { // WE ALWAYS END UP HERE
        // else file is empty so we add data
        $current_time = time().' ; ';
        $member_count = 582; // this value will come from a database
        fwrite($fopen, $current_time.$member_count);
        fclose($fopen);
        //echo "The file is empty so write new data to file. File size is actually ".filesize($filename)." bytes.\n"; 
    }

} else {
    // file either does not exist or cant be written to
    echo 'file does not exist or is not writeable'; // for testing
}

基本上,代码将位于成员列表页面上,该页面当前检索所有成员并计算已注册的成员数。脚本中的一点是,如果时间少于24小时,我们从文件中读取member_count,如果已经过了24小时或更长时间,那么我们查询数据库,获取成员数并将新数字写入文件,它是减少成员列表页面上的查询。

更新1:

此代码:

echo "The file size is actually ".filesize($filename)." bytes.\n";

总是输出以下内容,即使它不是0字节。

  

文件大小实际上是0字节。

也尝试了

var_dump (filesize($filename));

输出:

  

INT(0)

2 个答案:

答案 0 :(得分:9)

您正在使用:

fopen($filename, "w+") 

根据手册w+表示:

  

开放阅读和写作;将文件指针放在文件的开头,并将文件截断为零长度。如果该文件不存在,请尝试创建它。

因此文件大小为0是正确的。

您可能需要r+

答案 1 :(得分:1)

对不起,我知道这个问题已经结束,但我正在写我自己的答案,所以它可能对其他人有用

如果在 fopen 函数中使用 c+,

fopen($filePath , "c+");

然后filesize()函数返回文件的大小

并且您可以使用 clearstatcache($filePath) 清除此文件的缓存。

注意:当我们在 fopen() 中使用 c+ 然后使用 fread() 时,函数保留文件内容并将我们的字符串放在文件内容的末尾