如何在Mac OSX上确定文件的扩展属性和资源分叉及其大小?

6 投票
3 回答
3290 浏览
提问于 2025-04-17 03:13

我写了一个小工具,可以为任何文件夹结构创建xml文件,还能比较文件夹,这个工具支持Windows和Mac两个平台。不过在Mac上,递归计算文件夹大小时,结果并没有加总到总大小。经过调查发现,这是因为某些文件上有扩展属性资源分支

有没有人知道我怎么能在Python中确定这些扩展属性和资源分支及其大小呢?目前,我是用os.path.getsize来获取文件大小,然后把文件大小加起来算出文件夹的总大小。

3 个回答

2

有两个选择:

你可以试着用 subprocess 这个模块来调用系统的 "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_

你可能需要稍微调整一下扩展属性的格式,因为它们返回的是字符串,但可能是二进制格式(?)。

如果你能提供一个几乎能工作的简单代码示例,我可能能帮你多试试。

3

这只是个部分答案……不过如果你想知道资源分支的大小,可以简单地使用名为namedfork的伪目录。

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

理论上可能还有其他的命名分支存在……但你无法找到一个可用分支的列表。

至于扩展属性……你想知道哪个“大小”?你可以使用xattr模块来查看它们的内容,从而知道键值对的长度。

但是如果你更关心它们在磁盘上的大小……那么值得注意的是,扩展属性并不是存储在某个文件里的。它们是文件元数据的一部分(就像文件名和修改时间也是元数据),直接存储在B*-树节点中,而不是某个“文件”里。

3

你想要获取一个叫做 st_blocks 的隐藏成员,它是 stat 结果的一部分。

>>> 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 MB 的数据在资源分支中,这个信息在 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 KB(实际数据 13 字节)

撰写回答