6

私は、任意のフォルダー構造のxmlを作成し、プラットフォームとしてwinとMacの両方をサポートする生成されたxmlを介してフォルダーを比較するための、小さなユーティリティを作成しました。ただし、Macでは、フォルダーサイズを再帰的に計算しても、合計サイズにはなりません。調査の結果、特定のファイルに存在していた拡張属性リソースフォークが原因であることが判明しました。

これらの拡張属性とリソースフォーク、およびそれらのサイズをPythonで決定する方法を誰かが知ることができますか?現在、私はファイルのサイズを決定するために使用os.path.getsizeしており、最終的にフォルダサイズを決定するためにファイルサイズを追加しています。

4

3 に答える 3

3

単なる部分的な答えです...しかし、リソースフォークのサイズを知るには、namedforkpsuedodirectoryを使用するだけです。

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

理論的には、他の名前の付いたフォークが存在する可能性があります...しかし、使用可能なフォークのリストを見つけることはできません。

拡張属性に関して...あなたはどの「サイズ」に興味がありますか?xattrモジュールを使用して、それらのコンテンツ、つまりキーと値のペアの長さを検出できます。

しかし、「ディスク上の」サイズにもっと興味がある場合は、拡張属性が何らかのファイルに保存されていないことに注意してください。それらはファイルメタデータの一部を形成し(つまり、名前と変更時刻がメタデータであるように)、「ファイル」ではなく、B*ツリーノード内に直接保存されます。

于 2011-10-05T22:25:39.107 に答える
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

問題のファイルのリソースフォークには約10MBがあり、これはstat「非表示」属性の結果に表示されます。(これがどのファイルであるかを正確に知っている人にはボーナスポイントがあります。)属性は常に512バイトの増分を測定することが文書化されman 2 statていることに注意してください。st_blocks

注: 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 に答える
2

2つのオプション:

サブプロセスを使用して、システムの「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 に答える