Когда я запускаю этот код:
<?php $handle = fopen('/tmp/lolwut', 'w') or die("Cannot open File"); fwrite($handle, "1234567890"); fclose($handle); print_r(filesize('/tmp/lolwut')); ?>
Я получаю результат 10
, который является правильным количеством символов в файле.
Однако, поскольку блоки файловой системы намного больше, я ожидал, что размер файла будет «округлен» до более чем 512 байтов или даже 1 КБ. Почему нет?
Не путайте «размер файла» для «размера файла на диске»; Функция filesize
PHP дает вам первое, а не последнее.
Несмотря на то, что он явно не документирован как таковой, filesize
в основном реализуется с точки зрения stat
, а в stat
Linux делается различие между размером файла и размером файла на диске :
Все эти системные вызовы возвращают структуру
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
, но «true» размер файла st_size
доступен независимо.
( Это также относится к Windows .)