Вычисление значения, возвращаемого 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 ссылается только на размер ветвления данных.