Win32: обходной путь для GetFileAttributes () - PullRequest
7 голосов
/ 14 апреля 2010

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

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

Однако файл существует, путь существует, существует том - его H: \ Foo \ Bar - папка на сетевом ресурсе, сопоставленная на моем компьютере с H:.

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 14 апреля 2010

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

3 голосов
/ 14 апреля 2010

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

Лучше всего использовать путь UNC (\\share\dir\file).

0 голосов
/ 31 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...