Python - проверка прав доступа к каталогу
В Python на Windows есть способ определить, есть ли у пользователя разрешение на доступ к каталогу? Я посмотрел на os.access
но это дает ложные результаты.
>>> os.access('C:\haveaccess', os.R_OK)
False
>>> os.access(r'C:\haveaccess', os.R_OK)
True
>>> os.access('C:\donthaveaccess', os.R_OK)
False
>>> os.access(r'C:\donthaveaccess', os.R_OK)
True
Я делаю что-то неправильно? Есть ли лучший способ проверить, есть ли у пользователя разрешение на доступ к каталогу?
4 ответа
Проверка разрешений в Windows может быть сложной (например, остерегайтесь проблем в Vista с UAC! - см. Этот связанный вопрос).
Вы говорите о простом доступе для чтения, то есть о чтении содержимого каталога? Самый надежный способ проверки прав доступа - попытаться получить доступ к каталогу (например, сделать os.listdir
) и поймать исключение.
Кроме того, для правильной интерпретации путей вы должны использовать необработанные строки или экранировать обратную косую черту ('\\') - или использовать вместо нее прямую косую черту.
(РЕДАКТИРОВАТЬ: вы можете избежать косой черты, используя os.path.join
- рекомендуемый способ построения дорожек)
В то время как os.access старается определить, доступен путь или нет, он не претендует на то, чтобы быть идеальным. Из документов Python:
Примечание. Операции ввода-вывода могут завершаться сбоем, даже если access() указывает, что они будут выполнены успешно, особенно для операций с сетевыми файловыми системами, которые могут иметь семантику разрешений, выходящую за пределы обычной модели битов разрешений POSIX.
Рекомендуемый способ выяснить, есть ли у пользователя доступ к тому, что он пытается сделать, и перехватывать любые возникающие исключения.
На самом деле "C: \ haveaccess" отличается от "C: \ haveaccess". С точки зрения Python 'C:\haveaccess' не является допустимым путем, поэтому используйте вместо него 'C:\\haveaccess'. Я думаю, что os.access работает просто отлично.
Я предоставлю код для подхода @dF. к использованиюos.scandir
/os.listdir
с ЕАФП :
def can_access(path: str) -> bool:
"""Check if we can access folder on network drive"""
try:
os.scandir(path)
return True
except PermissionError:
return False