6

我编写了一个小实用程序,用于为任何文件夹结构创建 xml,并通过生成的 xml 比较文件夹,该 xml 支持 win 和 Mac 作为平台。但是在 Mac 上,递归计算文件夹大小不会加起来总大小。经过调查,这是由于某些文件上存在扩展属性资源分支。

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

4

3 回答 3

3

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 statst_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 字节)

于 2011-10-07T07:05:40.500 回答
3

只是部分答案......但要了解资源分叉的大小,您可以简单地使用 namedfork psuedodirectory

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

理论上可能存在其他命名的分叉......但您无法发现可用分叉的列表。

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

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

于 2011-10-05T22:25:39.107 回答
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_

您可能需要对扩展属性的格式进行一些尝试,因为它们作为字符串返回,但可能是二进制 (?)。

如果您提供一个几乎可以工作的最小代码示例,我也许可以多玩一点。

于 2011-10-03T15:30:22.140 回答