当我运行此代码时:
<?php
$handle = fopen('/tmp/lolwut', 'w') or die("Cannot open File");
fwrite($handle, "1234567890");
fclose($handle);
print_r(filesize('/tmp/lolwut'));
?>
我得到了结果10,这是文件中正确的字符数。
然而,由于文件系统块比这大得多,我预计文件大小会“向上取整”到 512 字节甚至 1KB。为什么不是?
当我运行此代码时:
<?php
$handle = fopen('/tmp/lolwut', 'w') or die("Cannot open File");
fwrite($handle, "1234567890");
fclose($handle);
print_r(filesize('/tmp/lolwut'));
?>
我得到了结果10,这是文件中正确的字符数。
然而,由于文件系统块比这大得多,我预计文件大小会“向上取整”到 512 字节甚至 1KB。为什么不是?
不要将“文件大小”与“磁盘上的文件大小”混淆;PHP 的filesize函数为您提供前者,而不是后者。
虽然没有明确记录,但filesize基本上是根据 实现的stat,并且在 Linux 上stat区分了文件大小和“磁盘上的文件大小”:
所有这些系统调用都返回一个
stat结构,其中包含以下字段:struct stat { // [...] off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ // [...] };
您期望的值为st_blocks * st_blksize,但无论如何都可以使用“真实”文件大小st_size。