我的测试代码是:
#!/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/