Инструмент командной строки stat
использует функции stat
/ fstat
и т. Д., Которые возвращают данные в структуре stat
. st_blocks
член структуры stat
возвращает:
Общее количество физических блоков размером 512 байт, фактически выделенных на диске. Это поле не определено для блочных или символьных специальных файлов.
Так что для вашего примера «Электронная почта», с размером 965 и числом блоков 8, это означает, что 8 * 512 = 4096 байт физически выделены на диске. Причина не в том, что файловая система на диске не выделяет пространство в единицах 512, а, очевидно, выделяет их в единицах 4096. (И единица выделения может варьироваться в зависимости от размера файла и сложности файловой системы. Например, ZFS поддерживает разные единицы размещения.)
Аналогично, для примера wxPython это указывает, что 7056 * 512 байт или 3612672 байт физически размещены на диске. Вы поняли.
Размер блока ввода-вывода является «подсказкой о« лучшем »размере блока для операций ввода-вывода» - обычно это единица выделения на физическом диске. Не путайте между блоком ввода-вывода и блоком, который stat
использует для указания физического размера; блоки для физического размера всегда 512 байт.
Обновление на основе комментария:
Как я уже сказал, st_blocks
- это то, как ОС показывает, сколько места используется файлом на диске. Фактические единицы размещения на диске - это выбор файловой системы. Например, ZFS может иметь блоки выделения переменного размера, даже в одном и том же файле , из-за способа распределения блоков: файлы начинаются с небольшого размера блока, а размеры блоков продолжают увеличиваться, пока не достигнут конкретный момент. Если файл будет позже усечен, он, вероятно, сохранит старый размер блока. Таким образом, основываясь на истории файла, он может иметь несколько возможных размеров блоков. Поэтому, учитывая размер файла, не всегда очевидно, почему он имеет конкретный физический размер.
Конкретный пример: на моем устройстве Solaris с файловой системой ZFS я могу создать очень короткий файл:
$ echo foo > test
$ stat test
Size: 4 Blocks: 2 IO Block: 512 regular file
(irrelevant details omitted)
ОК, небольшой файл, 2 блока, для этого файла используется физический диск 1024.
$ dd if=/dev/zero of=test2 bs=8192 count=4
$ stat test2
Size: 32768 Blocks: 65 IO Block: 32768 regular file
Хорошо, теперь мы видим использование физического диска 32,5 КБ и размер блока ввода-вывода 32 КБ. Затем я скопировал его в test3
и урезал этот test3
файл в редакторе:
$ cp test2 test3
$ joe -hex test3
$ stat test3
Size: 4 Blocks: 65 IO Block: 32768 regular file
Хорошо, теперь вот файл с 4 байтами в нем - точно так же как test
- но он физически использует 32,5 КБ на диске из-за способа, которым файловая система ZFS распределяет пространство. Размеры блоков увеличиваются при увеличении размера файла, но не уменьшаются при уменьшении размера файла. (И да, это может привести к значительному расходу пространства в зависимости от типов файлов и операций с файлами, которые вы выполняете в ZFS, поэтому он позволяет вам устанавливать максимальный размер блока для каждой файловой системы и динамически его изменять.)
Надеюсь, теперь вы должны понимать, что не обязательно существует простая связь между размером файла и использованием физического диска. Даже в приведенном выше примере непонятно, почему для хранения файла, размер которого точно равен 32 КБ, необходимо 32,5 Кбайт. Похоже, что ZFS обычно требуется дополнительно 512 байт для дополнительного собственного хранилища. Возможно, он использует это хранилище для контрольных сумм, подсчета ссылок, состояния транзакции - ведения учета файловой системы. Включая эти дополнения в указанный размер физического файла, создается впечатление, что ZFS пытается не вводить пользователя в заблуждение относительно физических затрат на файл. Это не означает, что банально перепроектировать расчет, не зная подробных сведений о реализации базовой файловой системы.