Почему функция C _stat неправильно устанавливает errno, когда доступ к папке запрещен - PullRequest
1 голос
/ 26 сентября 2010

Я разрабатываю C-программу для VS2005 и обнаружил, что когда доступ к папке ограничен, и я не могу создавать папки или что-либо удалять из папки, функция _stat для папки не устанавливает errno правильно , errno установлен в значение ENOENT. Я абсолютно не могу изменить разрешения, чтобы получить значение EACCES. Либо _stat возвращает 0 (без ошибок), либо значение errno установлено в ENOENT. Можете ли вы сказать мне, как сделать различие между реально существующей папкой и пользователем, у которого недостаточно прав для папки? Еще одна вещь, которую я не понимаю, это то, что конкретное разрешение приводит к тому, что возвращается -1. Когда я смотрю на действующие права доступа к папке, которую я тестировал, _stat ничего не имеет в столбце «Запретить». Даже «Создать папки / Добавить данные» отмечен, в то время как я не могу создавать папки в нем.

Спасибо & BR -Matti

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

Атрибуты безопасности Windows слишком детализированы, чтобы проверить это с помощью _stat (). В его реализации используется API-функция FindFirstFile (), которая завершится ошибкой только в том случае, если не предоставлено право перечислять файлы. Это редко имеет место, более ограничивающий тип, который обычно отключен - это Write или Modify.

Взлом API безопасности для тестирования ACL часто избегается и крайне непереносим. Вы просто обнаруживаете, что у вас нет необходимых прав при попытке открыть файл. Вполне приемлемо, потому что вы ничего не можете сделать в своем коде, чтобы получить право доступа к файлу.

1 голос
/ 26 сентября 2010

Я не уверен на 100% в этом, но вы пробовали _doserrno ? Согласно документации MSDN:

For I/O operations, use _doserrno to access the operating-system error-code 
equivalents of errno codes. For most non-I/O operations the value of _doserrno is   
undefined.
...