Python 3:win32com对象。大小引发异常(pywintypes.com_error)

时间:2019-02-12 19:43:22

标签: python python-3.x pywin32 win32com

我正在使用用户Augustin在此处发布的解决方案:very quickly getting total size of folder

folderPath = r"C:\Users\e46ldc\Documents"
fso = com.Dispatch("Scripting.FileSystemObject")
folder = fso.GetFolder(folderPath)

MB = 1024 * 1024.0
print("%.2f MB" % (folder.Size / MB))

发生的异常如下,并且仅在顶级C:\ Users \(user)或在Documents上发生。我可以在更下层的文件夹(即下载或文档中的文件夹)上完美运行它:

Traceback (most recent call last):
  File "C:\Users\e46ldc\AppData\Local\Programs\Python\Python37-32\win32dirinfo.py", line 14, in <module>
    print("%.2f MB" % (folder.Size / MB))
  File "C:\Users\e46ldc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\win32com\client\dynamic.py", line 516, in __getattr__
    ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146828218), None)

经过大量挖掘,看来这是一个权限错误。但是,即使以管理员身份运行脚本,我仍然会遇到它。我已经验证它可以正确找到该文件夹​​,并且可以使用os.walk()或scandir等其他方法正常访问该文件夹。

有什么办法解决吗?这种方法是我测试过的最快的方法,可以在Windows上获取目录的大小,因此我希望我仍然可以使用它。

1 个答案:

答案 0 :(得分:2)

通过在我的计算机上进行实验,这似乎与两个junction points的权限相关联:

  

C:\ Users \ Adam \ AppData \ Local \ Microsoft \ Windows \ INetCache \ Content.IE5

指向

  

C:\ Users \ Adam \ AppData \ Local \ Microsoft \ Windows \ INetCache \ IE

  

C:\ Users \ Adam \ AppData \ Local \ Microsoft \ Windows \ INetCache \ Low \ Content.IE5

指向

  

C:\ Users \ Adam \ AppData \ Local \ Microsoft \ Windows \ INetCache \ Low \ IE]

奇怪的是,这两个目的地都是可访问的,因此这是联结的访问权限,而不是它们的目的地。

This answer讨论了此特定文件的问题。

This answer解释了Size属性的工作方式,以及当遇到没有足够权限的文件夹时为什么失败。看起来Size试图遍历联结点,但由于联结权限而未能这样做。

此问题的解决方案可能取决于您要求用户配置文件文件夹(包括AppData)的大小。如果您不关心AppData,则可以对所有子目录的大小求和。

或者,如果您确实需要AppData的大小,则可以获得所有文件夹(包括AppData)的大小,对于那些出错的文件夹(大概只是AppData),您可以遍历层次结构,在可能的情况下对文件夹大小求和,直到您碰到了一些您无法导航的东西(即路口)。