Win32: contournement pour GetFileAtsortingbutes ()

Je remarque un problème qui a surgi à quelques resockets au cours des années et qui semble beaucoup se produire sous Windows 7 dans notre version actuelle.

Lorsque je teste l’existence d’un fichier, en utilisant :: GetFileAtsortingbutes (filename), je récupère souvent INVALID_FILE_ATTRIBUTES, et GetLastError () est ERROR_PATH_NOT_FOUND (3).

Cependant, le fichier existe, le chemin existe, le volume existe – son H: \ Foo \ Bar – qui est un dossier sur un partage réseau mappé sur ma machine sur H :.

Si j’ouvre une fenêtre de commande, il peut le voir. Si j’utilise Windows Explorer pour accéder à ce dossier, il peut le voir.

Si je le fais avant de lancer notre application, nous pouvons le voir.

Mais si je lance notre application d’abord, après un redémarrage, avant que quelque chose ait tenté de voir H: \, alors je reçois l’erreur ci-dessus à plusieurs resockets.

Il m’a toujours semblé que Windows m’aidait en renvoyant ERROR_PATH_NOT_FOUND immédiatement lorsque le mapping de partage donné n’a pas été reconnecté à cette session (il est configuré pour se reconnecter automatiquement). C’est inutile de dire que c’est agaçant. Existe-t-il un autre appel API que je pourrais faire pour “déterminer si le fichier / dossier X existe?”

Exécutez-vous l’application en tant que service? Ou comme un autre utilisateur? Il peut s’agir d’un problème d’autorisation. Les informations d’identification qu’il utilise peuvent ne pas être autorisées à lire ce répertoire.

La connexion du disque doit être restaurée, cela se fait automatiquement par le shell. Auparavant, cela se faisait par WNetRestoreConnectionW (), mais cette fonction a été supprimée dans Vista. Je pense que vous devrez le faire de cette façon maintenant .

Utiliser un chemin UNC ( \\share\dir\file ) pourrait être le meilleur remède.

Un moyen plus simple consiste à utiliser ShellExecuteEx avec l’indicateur SEE_MASK_CONNECTNETDRV .