我正在使用用户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上获取目录的大小,因此我希望我仍然可以使用它。
答案 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),您可以遍历层次结构,在可能的情况下对文件夹大小求和,直到您碰到了一些您无法导航的东西(即路口)。