Короче говоря: я создаю базу данных, которая включает все котировки, когда-либо сделанные в нашей компании. Следить за конкретным расширением файла: *.prc Одна из информации, которую я хотел бы получить, — это владелец файла. Я использую следующий код (показывая только его часть):
import os, time, win32security, subprocess
from threading import Thread
from time import time
def GET_THE_OWNER(FILENAME):
open (FILENAME, "r").close ()
sd = win32security.GetFileSecurity (FILENAME, win32security.OWNER_SECURITY_INFORMATION)
owner_sid = sd.GetSecurityDescriptorOwner ()
name, domain, type = win32security.LookupAccountSid (None, owner_sid)
return name
starttime = time()
path = "C:/Users/cbabycv/Documents/Python/0. Quotations/Example"
for root, dirs, files in os.walk(path):
for file in files:
if (file.endswith(".prc")):
#getting data from the file information
Filename = os.path.join(root,file)
try:
Owner = GET_THE_OWNER(Filename)
except:
Owner = "Could not get the owner."
print(Owner)
endtime = time()
print (Owner)
print(endtime-starttime, " sec")
Процесс медленный (особенно когда вам нужно прочитать около 100 000 файлов). Интересно, есть ли другой способ сделать это быстрее? Обратите внимание, я прошу ОС Windows, а не все остальное (в этом случае я не могу использовать os.stat() - просто не работает в Windows). Я пробовал другой способ, описанный здесь: как найти владельца файла или каталога в python Автор Paal Pedersen, но это даже медленнее, чем при использовании Windows Api.
Я использую os.walk() для поиска файлов на сервере. У меня нет точного местоположения файлов, они могут быть в любой папке (поэтому я просто просматриваю каждый файл во всех папках/подпапках и смотрю, является ли он файлом *.prc). Один предложил многопроцессорность - большое спасибо :) Я попытаюсь оптимизировать весь код, но мой вопрос остается в силе - есть ли более быстрый/лучший способ найти владельца файла в ОС Windows?
@theCreator Предлагается использовать powershell. Пробовали это. Это прибл. в 14 раз медленнее...
import os, subprocess
from pathlib import Path
from time import time
starttime = time()
def GET_THE_OWNER(cmd):
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
completed = subprocess.run(["powershell.exe", "-Command", "Get-Acl ", cmd, " | Select-Object Owner"], capture_output=True, startupinfo=startupinfo)
return completed
path = Path('C:/Users/cbabycv/Documents/Python/0. Quotations/Example')
for root, dirs, files in os.walk(path):
for file in files:
if (file.endswith(".prc")):
#getting data from the file information
Filename = os.path.join(root,file)
Filename = "\"" + Filename +"\""
Owner = GET_THE_OWNER(Filename)
if Owner.returncode != 0:
print("An error occured: %s", Owner.stderr)
else:
print(Owner.stdout)
endtime = time()
print(endtime-starttime, " sec")