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。但是第二次调用失败了。文件夹 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 Volume Information”。

再深入一点:python 给出的错误代码是有符号的,而为了进行合理的查找,微软将它们描述为无符号并期望它们。感谢此线程中的 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)

现在搜索两个十六进制数字,第二个应该会导致很多“您不允许...”查询和答案。

于 2014-04-25T09:13:15.637 回答