windows - python win32com FileSystemObject 获取巨大文件夹失败

标签 windows python-3.x pywin32

我的测试代码是:

#!/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位存储结果上。 32位int不能存储12.6GB大小。

这里真正的问题是什么?如何解决它?

最佳答案

这既不是目录大小问题,也不是 32/64 位问题。 这甚至不是 python2 或 python3 的问题。

您的错误翻译为“不允许访问!”

最简单的测试方法是创建一个目录,其中仅允许所有者读取,而所有其他人根本没有任何权限。然后将此目录作为输入 - 即使该目录为空,您也会得到相同的错误。一个很好的例子是本地“c:\system Volume Information”。

再深入一点: python 给出的错误代码是有符号的,而为了合理的查找,微软描述并期望它们是无符号的。感谢 EB this thread和蒂姆·彼得斯在 this thread ,使用示例,您将获得合理的错误代码。

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)

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

关于windows - python win32com FileSystemObject 获取巨大文件夹失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514014/

相关文章:

python - Windows 中的 Jenkins 在激活 Python VENV 后停止

windows - 在 Windows 批处理文件中控制 psftp

python-3.x - 用于各种维度输入的高效 PyTorch DataLoader collat​​e_fn 函数

python - 使用 python 修改文件夹的 Exchange ACL

python - 发生异常 : ModuleNotFoundError No module named 'win32api'

python - Win32 事件循环似乎是程序瓶颈

windows - Windows 上的 CouchDB?

python - argparse:在某些情况下将参数从位置更改为可选

python - 尝试使用返回 self 的 __iter__ 方法模拟迭代时出现 RecursionError

java - 如何调用dll