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

时间:2011-09-27 17:44:17

标签: python macos

我为任何文件夹结构编写了small utility for creating xml,并通过生成的xml编写了comparison of folders,支持win和Mac作为平台。但是在Mac上,递归计算文件夹大小不会增加总大小。经过调查,结果是由于某些文件中存在extended attributesresource forks

任何人都可以知道如何在python中确定这些扩展属性和资源分支及其大小。目前,我使用os.path.getsize来确定文件大小并添加文件大小以最终确定文件夹大小。

3 个答案:

答案 0 :(得分:2)

您希望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 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个字节)

答案 1 :(得分:1)

两个选项:

您可以尝试使用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_

您可能需要使用扩展属性的格式稍微玩一下,因为它们以字符串形式返回,但可能是二进制(?)。

如果你提供一个最小的几乎可以工作的代码示例,我或许可以再玩一次。

答案 2 :(得分:1)

仅仅是部分答案......但要了解资源分叉的大小,您只需使用namedfork psuedodirectory

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

理论上可能存在其他命名的叉子......但是你找不到可用叉子的列表。

关于扩展属性......您对“大小”感兴趣?您可以使用xattr模块来发现它们的内容,从而发现键/值对的长度。

但是如果你对它们的“磁盘”大小感兴趣...那么值得注意的是扩展属性不存储在某种文件中。它们构成文件元数据的一部分(即,就像名称和修改时间是元数据一样)并直接存储在B * -tree节点中,而不是某些“文件”