2012-01-23 2 views
4

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

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

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

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

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

Итак, каков правильный способ использования функций WinAPI для проверки того, что у вас есть доступ на запись в папку?

ответ

4

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

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

+0

+1 Я согласен 100% –

+0

Особенно, поскольку игра меняется, когда AV-продукты участвуют. Они хорошо известны тем, что блокируют некоторые операции во временной папке во имя безопасности, например. блокирование исполняемых файлов. – Deanna

3

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

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

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

+0

Ну, я буду реплицировать код, который все равно произойдет, записав файл и посмотрев, получил ли я сообщение об отказе в доступе. Я хочу проверить, существует ли каталог и доступен для записи, и если нет, я могу вернуться в каталог по умолчанию. –

+1

Не беспокойтесь. Этот раздел документов MSDN просто означает, что API GetTempPath не создаст для вас каталог. Это не значит, что это нормально или разумно, чтобы он не существовал. Предположим, что существует временная папка и записывается в нее. Если это не удается сообщить об ошибке пользователю и отказаться. Подумайте о том, что рабочая папка temp является предварительным условием для вашего программного обеспечения. Или подумайте об этом так, что, если ваш «каталог по умолчанию» недоступен? Будете ли вы отступать за это? Вы должны провести линию где-то. –

+0

У меня такая же проблема. В какой-то момент мне нужно знать, есть ли у меня доступ к записи в какой-либо каталог.Прямо сейчас у меня есть решение, которое работает (создайте файл со случайным именем в этом каталоге, проверьте, было ли создание успешным и удалил файл). Единственная проблема возникает, если каталог только для записи, тогда файл, созданный непосредственно перед этим, не может быть удален. –