Правильный способ проверки каталога доступен для записи - PullRequest
4 голосов
/ 23 января 2012

Я недавно добавил использование GetTempPath в приложение.Во время проверки кода было подчеркнуто, что описание GetTempPath содержит информацию:

Приложение должно проверять наличие пути и адекватные права доступа к пути перед любым использованием операций ввода-вывода файла..

Теперь весь доступ к файлам заключен в блоки try / catch, и какая будет система, которая не имеет доступа к своему собственному временному каталогу?

Моя первоначальная идея была быпопытаться создать каталоги, если они не существуют (через GetFileAttributes и CreateDirectory), а затем создать файл, записать байт, а затем удалить файл.Хотя это сработает, оно пахнет невежеством - наверняка есть лучший способ проверить, есть ли у вас доступ на запись в папку?

Я начал искать и нашел константы атрибута файла, общие права доступа, стандартные права доступа, файлКонстанты прав доступа и функция GetSecurityInfo.Казалось, что все это создает решение, которое длиннее, чем создание файла, и проверяет, придерживается ли он метода.

Итак, как правильно использовать функции проверки WinAPI, у вас есть права на запись в папку?

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Примечание MSDN вводит в заблуждение. Возможно, вы захотите проверить, существует ли возвращенный путь (и если нет, то создать его), но единственный способ узнать, можете ли вы написать там, - это написать туда.

Кроме того, то, что вы можете писать там сейчас, не означает, что вы можете писать там позже. Пользователь или другие программы могут удалять объекты, изменять настройки безопасности, блокировать каталоги и т. Д. Попытка заблаговременно подтвердить, что это место, которое вы можете написать, - пустая трата времени. Просто напишите, когда вам нужно, и будьте готовы к неудаче.

3 голосов
/ 23 января 2012

Лучший способ - попытаться записать файлы в каталог. Если запись не удалась из-за отсутствия прав, об этом сообщит код ошибки. Ищите ERROR_ACCESS_DENIED.

Если вы попытаетесь сделать это любым другим способом, то вы просто скопируете системный код, который должен был все равно работать. И у вас мало шансов идеально воспроизвести его для текущих версий Windows и будущих версий.

Нет необходимости создавать файл и записывать в него один байт. Просто предположите, что у вас есть права на запись во временную папку и попытайтесь записать все файлы, которые вам нужны. Если вы когда-нибудь столкнетесь с ошибкой, вы можете также прекратить процесс. Нет смысла продолжать, если вы не можете записать во временную папку.

...