Вычисление значения, возвращаемого NSURLFileAllocatedSizeKey, с использованием системных вызовов OSX

Чтобы вопрос имел смысл, позвольте мне провести вас через весь контрольный пример, поэтому, пожалуйста, потерпите меня.

Давайте создадим файл.

эхо 0 > ~/SAMPLE

Это делает простой файл размером 2 байта (по умолчанию echo добавляет новую строку, и это не повредит примеру).

stat -f "% b% Z" ~ / SAMPLE

Выход:

8 2

Как и ожидалось, этот файл выделил 8 блоков и имеет размер 2 байта (Get Info в Finder говорит нам, что он имеет длину 2 байта и 4 Кбайт на диске, что составляет 8 блоков * 512 байтов на блок), так что это все хорошо.

Теперь давайте добавим атрибут, в частности ветку ресурса:

xattr -w com.apple.ResourceFork 000000 ~ / SAMPLE

Давайте снова вызовем stat:

stat -f "% b% Z" ~ / SAMPLE

Выход:

16 2

После добавления атрибута ветки ресурса файловая система выделила 16 блоков для этого файла.

ls -l @ ~ / SAMPLE

Выход:

com.apple.ResourceFork 6

Подводя итог: мы добавили 6 байтов в ветвь ресурса, и теперь этот файл выделяет 16 блоков (из 8 только до добавления ветки ресурса), имеет содержимое только 2 байта, а ветвь ресурса имеет 6 байтов.

Если мы запустим этот файл через NSURL API, мы получим это:

NSURL * url = [NSURL fileURLWithPath: @ "~ / SAMPLE"];

[url getResourceValue: & size forKey: NSURLFileSizeKey error: nil]; // вывод: 2

[url getResourceValue: & size forKey: NSURLFileAllocatedSizeKey error: nil]; // вывод: 4096

[url getResourceValue: & size forKey: NSURLTotalFileAllocatedSizeKey error: nil]; // output: 8192

Итак, мой вопрос: если бы мы использовали только системные вызовы (bash или системный API), как бы мы получили 4096, результат для ключа NSURLFileAllocatedSizeKey?

NSURLFileSizeKey прост - мы можем просто использовать ls -l, например, также для NSURLTotalFileAllocatedSizeKey - мы можем использовать количество блоков из stat (16) и умножить на 512, но как мы можем получить значение для NSURLFileAllocatedSizeKey, которое равно 4096 в этот случай?

Насколько я понимаю, это было бы значение, возвращаемое ключом NSURLFileAllocatedSizeKey, если бы мы должны были удалить атрибут fork ресурса, но как мы можем получить это значение, используя системные API или bash?

1 ответ

Возможно, NSURLFileAllocatedSizeKey ссылается на выделенное пространство только для ветвления данных, точно так же, как NSURLFileSizeKey ссылается только на размер ветвления данных.

Другие вопросы по тегам