2

私のテストコードは次のとおりです。

#!/usr/bin/env python
import win32com.client

def GetFolderSizeQuick(target_folder):
    fso = win32com.client.Dispatch("Scripting.FileSystemObject")
    fobj = fso.GetFolder(target_folder)
    return fobj.size

print(GetFolderSizeQuick("d:/pytools"))
print(GetFolderSizeQuick("d:/cygwin"))

結果は次のとおりです。

D:\>python a.py
160659697
Traceback (most recent call last):
  File "a.py", line 10, in <module>
    print(GetFolderSizeQuick("d:/cygwin"))
  File "a.py", line 7, in GetFolderSizeQuick
    return fobj.size
  File "D:\Applications\Python33\lib\site-packages\win32com\client\dynamic.py",
line 511, in __getattr__
    ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
pywintypes.com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2146828218), None)

d:/pytools フォルダーでの最初の呼び出し GetFolderSizeQuick は機能します。約153MBです。しかし、2 回目の呼び出しは失敗しました。フォルダ d:/cygwin は約 12.6GB です。

私はpython3.3.0 32ビットバージョンでWindows 7に取り組んでいます。したがって、結果を保存するために32ビットまたは64ビットで問題が発生したと思います。32bit int は 12.6GB のサイズを格納できません。

ここでの本当の問題は何ですか、それを修正する方法は?

4

1 に答える 1

3

これはディレクトリ サイズの問題でも、32/64 ビットの問題でもありません。それは python2 または python3 の問題ではありません。

あなたのエラーは「アクセスが許可されていません!」に変換されます。

テストの最も簡単な方法は、所有者のみが読み取りを許可され、他のすべてのユーザーにはまったく権限がないディレクトリを作成することです。次に、このディレクトリを入力として使用します。ディレクトリが空であっても、同じエラーが発生します。良い例は、ローカルの「c:\system ボリューム情報」です。

もう少し掘り下げてみましょう: python によって提供されるエラーコードは署名されていますが、合理的なルックアップのために、Microsoft はそれらを署名されていないと説明し、期待しています。このスレッドのEB とこのスレッドTim Peters に感謝します。例を使用すると、合理的なエラーコードが得られます。

import win32com.client
import pywintypes

def get_folder_size(target_folder):
    fso = win32com.client.Dispatch("Scripting.FileSystemObject")
    fobj = fso.GetFolder(target_folder)
    return fobj.size


if __name__ == '__main__':
    try:
        get_folder_size('c:/system volume information')
    except pywintypes.com_error, e:
        print e  # debug, have to see which indices
        print hex(e[0]+2**32), hex(e[2][5]+2**32)

ここで両方の 16 進数を検索します。2 番目の数字は、多くの「許可されていません...」というクエリと回答につながるはずです。

于 2014-04-25T09:13:15.637 に答える