Win32: работа вокруг GetFileAttributes()

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

когда я проверяю наличие файла, используя :: GetFileAttributes (filename), я часто возвращаю INVALID_FILE_ATTRIBUTES, а GetLastError () - ERROR_PATH_NOT_FOUND (3).

однако файл существует, путь существует, том существует-его H:FooBar -которая является папкой на сетевом ресурсе, который отображается на моя машина для H:.

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

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

но если я запускаю наше приложение сначала, после перезагрузки, прежде чем что-либо попытается просмотреть H:, то я получаю вышеуказанную ошибку повторно.

Мне всегда казалось, что Windows "помогает" мне, возвращая ERROR_PATH_NOT_FOUND сразу же, когда данный share-mapping не был повторно подключен этот сеанс (он настроен на автоматическое повторное подключение). Это, разумеется, раздражает. Есть ли другой вызов API, который я мог бы сделать ,чтобы " определить, существует ли файл/папка X?"

3 ответов


вы используете приложение в качестве службы? Или как какой-то другой пользователь? Это может быть проблема с разрешениями. Учетные данные, которые он использует, могут не иметь разрешения на чтение этого каталога.


соединение с диском необходимо восстановить, это делается автоматически оболочкой. Раньше это выполнялось WNetRestoreConnectionW (), но эта функция была удалена в Vista. Я думаю, вам нужно это сделать сюда.

использование пути UNC (\share\dir\file) может быть лучшим лечения.


более простой способ-использовать ShellExecuteEx с флагом SEE_MASK_CONNECTNETDRV.