如何在Mac OSX上确定文件的扩展属性和资源分叉及其大小?
3 个回答
有两个选择:
你可以试着用 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_
你可能需要稍微调整一下扩展属性的格式,因为它们返回的是字符串,但可能是二进制格式(?)。
如果你能提供一个几乎能工作的简单代码示例,我可能能帮你多试试。
这只是个部分答案……不过如果你想知道资源分支的大小,可以简单地使用名为namedfork的伪目录。
os.path.getsize("<path to file of interest>/..namedfork/rsrc")
理论上可能还有其他的命名分支存在……但你无法找到一个可用分支的列表。
至于扩展属性……你想知道哪个“大小”?你可以使用xattr模块来查看它们的内容,从而知道键值对的长度。
但是如果你更关心它们在磁盘上的大小……那么值得注意的是,扩展属性并不是存储在某个文件里的。它们是文件元数据的一部分(就像文件名和修改时间也是元数据),直接存储在B*-树节点中,而不是某个“文件”里。
你想要获取一个叫做 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 字节)