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
Другие вопросы по тегам