Arco
Там где в коде у меня закоментированная строка, она отвечает как раз за получение инфы о системных папках, но у меня так тоже не срабатывает с такой же ошибкой. Вот я и не могу понять почему вроде функция есть, а у меня не работает.
оно работает, в том плане что получает обьект, а “разрешение отклонено” оно выдает когда вы пытаетесь получить доступ к свойству Size. Попробуйте вместо Size вывести, например, Name.
Как это обойти, чесно говоря ХЗ. fso.GetFolder это из VBS. Скрипт на вбс ведет себя ровно также.. Судя по обьяснениям на MSDN такая ошибка вылазит если к вас нету права на “list contents” хотябы на один файл/папку внутри.
Arco
Если вдруг у кого-нибудь есть модуль для вычислений на C++ который можно подключить к Python, буду рад если поделитесь.
Ну такое гуглиться за секунду:
https://www.codespeedy.com/how-to-find-the-size-of-a-folder-in-cpp/компилируете в ДЛЛ и подкюлчаете через ctypes. это совсем просто.
Можно написать свой модуль для пайтона
https://docs.python.org/3/extending/extending.html , там чутка посложнее будет.
Arco
если вам не сложно, возьмите папку гиг на 50 и там будет заметна разница. (Ну на моём железе - Hdd 7200 об.мин.)
А вот тут самое интересное:
Взял я папку 600 гиг(в 'd:\\_Games примонтирован терабайтный WD на 7200 обормотов), скормил вот такой скрипт склепаный на коленке :
import time, os
from pathlib import Path
from os.path import join, getsize
import win32com.client as com
folderPath = 'd:\\_Games\\Games'
MB = 1024 * 1024
s_time = (time.time())
fso = com.Dispatch("Scripting.FileSystemObject")
folder = fso.GetFolder(folderPath)
print('#1, win32com:', int(folder.Size / MB), 'MB', time.time() - s_time)
s_time = (time.time())
root_directory = Path(folderPath)
print('#2, pathlib:', int(sum(f.stat().st_size for f in root_directory.glob('**/*') if f.is_file()) / MB), 'MB', time.time() - s_time)
s_time = (time.time())
size=0
for root, dirs, files in os.walk(folderPath):
size+=sum(getsize(join(root, name)) for name in files )
print('#3 os.walk:', int(size / MB), 'MB' , time.time() - s_time)
Результат меня удивил(после MB это секунды сколько оно выполнялось):
>>>
#1, win32com: 626330 MB 184.51770329475403
#2, pathlib: 626330 MB 105.98217296600342
#3 os.walk: 626330 MB 49.874070167541504
>>>
Еще больше меня удивил повторный запуск:
>>>
#1, win32com: 626330 MB 3.32000470161438
#2, pathlib: 626330 MB 87.87312316894531
#3 os.walk: 626330 MB 49.45407009124756
>>>
После перезагрузки компа, результат примерно тот же самый.Первый раз GetFolder считает ну очень долго, а последующие почти мгновенно.
Что там внутри GetFolder ХЗ. Скорее всего гдето оно кеширует размеры папок, а потом просто смотрит если папка не менялась то берет значения из кеша, если менялась- пересчитывает. А может еще чтото.
Конечно же для, чистоты экспериемнат нужно было бы после вычисления каждым методом перезапускать ПК, чтото мне подсказывает что результаты #2 и #3 будут в несколько раз большими в случае “холодного запуска”, но тут уже сами можете провести замеры.
Так что смотрите можете реализовать схожий алгоритм на пайтоне, и будет вам “прирост скорости”.