Я хочу, чтобы код был похож на функцию du
. Я попробовал это с помощью функции stat()
. Я узнал, что st_blocks
сообщается из stat()
- это фактический номер блока, выделенный на диске. Размер блока должен составлять 512 байт, а st_blocks*512
должно быть выделенным номером байта для файла. Тем не менее, я нашел сбой с толку в среде Cygwin. Сначала я создаю файл размером 8 КБ, используя команду dd
.
% dd if=/dev/urandom bs=4096 count=2 of=testfile
2+0 records in
2+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00791222 s, 1.0 MB/s
Затем я запускаю команду stat
с файлом:
% stat testfile
File: testfile
Size: 8192 Blocks: 8 IO Block: 65536 regular file
Device: 7727c30h/124943408d Inode: 25614222880771065 Links: 1
Access: (0664/-rw-rw-r--) Uid: (197881/ crystal) Gid: ( 513/ None)
Access: 2018-05-01 15:11:50.760626400 +0800
Modify: 2018-05-01 15:11:50.761626500 +0800
Change: 2018-05-01 15:11:50.761626500 +0800
Birth: 2018-05-01 15:11:50.760626400 +0800
Я не думаю, что в сгенерированном файле есть «дыра». Я получаю файл с 8 выделенными блоками, который подразумевает, что размер блока составляет 1 КБ, а не 512 Б. Если я делаю код C с вызовом stat()
, st_blocks
получает тот же результат.
Пока что все статьи говорят, что размер блока составляет 512 ББ. Есть ли исключение? Если да, как я могу получить фактический размер блока? Или как я могу получить фактическое дисковое пространство, занимаемое файлом?