Python 3: объект win32com. Размер вызывает исключение (pywintypes.com_error) - PullRequest
0 голосов
/ 12 февраля 2019

Я использую решение, опубликованное пользователем Augustin здесь: очень быстро получает общий размер папки

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 \ (пользователь) на верхнем уровне или в Документах.Я могу прекрасно запустить его на папках, расположенных ниже (например, Загрузки или папки в Документах):

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 голосов
/ 13 февраля 2019

После экспериментов на моей машине это связано с разрешениями для двух точек соединения :

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]

Странно то, что оба эти места назначения доступны такэто права доступа для узлов, а не их пунктов назначения.

В этом ответе обсуждаются проблемы, связанные с этим конкретным файлом.

В этом ответе объясняется, как работает свойство Size и почему оно не работает при его обнаружении.папки без соответствующих разрешений.Похоже, что Size пытается пересечь точку соединения и не может этого сделать из-за разрешений на соединение.

Решение этой проблемы может зависеть от того, насколько вам требуется размер папки профиля пользователя, включая AppData.Если вас не интересует AppData, вы можете просто суммировать размер всех подкаталогов.

В качестве альтернативы, если вам требуется размер AppData, вы можете получить размер всех папок (включая AppData), а для тех, которые выдают ошибку, предположительно только AppData, вы можете пройти по иерархии, суммируя размеры папок.где это возможно, пока вы не наткнетесь на то, в чем вы не можете перемещаться (например, на перекрестках).

...