Как определить расширенные атрибуты файла и вилки ресурсов с их размером на Mac OSX? - PullRequest
4 голосов
/ 27 сентября 2011

Я написал небольшую утилиту для создания xml для любой структуры папок и сравнения папок через сгенерированный xml, который поддерживает win и Mac в качестве платформ. Однако на Mac рекурсивный расчет размера папки не дает общего размера. В ходе расследования выяснилось, что это связано с расширенными атрибутами и вилками ресурсов , которые присутствовали в определенных файлах.

Может кто-нибудь знать, как я могу определить эти расширенные атрибуты и вилки ресурсов и их размер, предпочтительно в python. В настоящее время я использую os.path.getsize, чтобы определить размер файла, и добавляю размер файла, чтобы определить размер папки.

Ответы [ 3 ]

2 голосов
/ 07 октября 2011

Требуется скрытый элемент результата stat с именем st_blocks.

>>> s = os.stat('some_file')
>>> s
posix.stat_result(st_mode=33261, st_ino=12583347, st_dev=234881026,
                  st_nlink=1, st_uid=1000, st_gid=20, st_size=9889973,
                  st_atime=1301371810, st_mtime=847731600, st_ctime=1301371422)
>>> s.st_size / 1e6 # size of data fork only, in MB
9.889973
>>> x.st_blocks * 512e-6 # total size on disk, in MB
20.758528

В рассматриваемом файле содержится около 10 МБ в ветке ресурсов, которая отображается в результате из stat но в "скрытом" атрибуте.(Бонусные баллы для тех, кто точно знает, какой это файл.) Обратите внимание, что в man 2 stat задокументировано, что атрибут st_blocks всегда измеряет приращения в 512 байт.

Примечание: st_size измеряет количество байтов данных, но st_blocks измеряет размер на диске, включая служебные данные от частично используемых блоков.Итак,

>>> open('file.txt', 'w').write('Hello, world!')
13
>>> s = os.stat('file.txt')
>>> s.st_size
13
>>> s.st_blocks * 512
4096

Теперь, если вы выполните «Получение информации» в Finder, вы увидите, что файл имеет:

Размер: 4 КБ на диске (13байт)

1 голос
/ 06 октября 2011

Только частичный ответ ... но, чтобы узнать размер вилок ресурсов, вы можете просто использовать namedfork psuedodirectory

os.path.getsize("<path to file of interest>/..namedfork/rsrc")

Теоретически возможно, что могут существовать другие именованные вилки ... но вы можете 'не можете найти список доступных вилок.

Что касается расширенных атрибутов ... какой "размер" вас интересует?Вы можете использовать модуль xattr для обнаружения их содержимого и, следовательно, длины пар ключ / значение.

Но если вас больше интересует их размер "на диске" ... тогда стоит отметить, что расширенные атрибутыне хранятся в каком-то файле.Они образуют часть метаданных файла (т. Е. Точно так же, как имя и измененное время являются метаданными) и хранятся непосредственно в узле B * -дерева, а не в каком-то «файле»

1 голос
/ 03 октября 2011

Два варианта:

Вы можете попробовать использовать подпроцесс для вызова системной команды "ls" или "du", которая должна знать о расширенных атрибутах.

или

Вы можете установить пакет xattr , который может читать ветку ресурса в дополнение к расширенным атрибутам (доступ к ним осуществляется через xattr.XATTR_RESOURCEFORK_NAME. Что-то подобное может работать:

import xattr

x = xattr.xattr("/path/to/my/file")

size_ = 0
for attribute in x:
    size_ += len(x[attribute])

print size_

Возможно, вам придется немного поиграться с форматом расширенных атрибутов, поскольку они возвращаются в виде строк, но могут быть двоичными (?).

Если вы предоставите минимальный почти рабочий примеркода, я мог бы играть с ним немного больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...