Почему я получаю такие точные результаты от `filesize`?

Когда я запускаю этот код:

<?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 .)