Comment obtenir un nom associé à un HANDLE ouvert
Quelle est la meilleure façon d'obtenir le nom de fichier associée avec un HANDLE ouvert dans Win32?
source d'informationauteur Max Caceres
Vous devez vous connecter pour publier un commentaire.
Quelle est la meilleure façon d'obtenir le nom de fichier associée avec un HANDLE ouvert dans Win32?
source d'informationauteur Max Caceres
Vous devez vous connecter pour publier un commentaire.
Il y a une bonne (bien que les sans-papiers) façon de le faire sur Windows XP qui travaille également avec des répertoires -- la même méthode GetFinalPathNameByHandle utilise sur Windows Vista et les versions ultérieures.
Voici la aux plates déclarations. Certains de ces projets sont déjà en
WInternl.h
etMountMgr.h
mais je viens de les mettre ici quand même:Voici la fonction de base:
et voici un exemple d'utilisation:
modifier Merci pour les commentaires à propos de ces Vista ou Server 2008. J'ai manqué dans la page. Suppose que je devrais avoir lu le ensemble article 😉
Il semble que vous pouvez utiliser GetFileInformationByHandleEx() pour obtenir cette information.
Vous aurez probablement envie de faire quelque chose comme:
Vérifiez la page MSDN pour m'assurer que je n'ai pas vous avoir induit en erreur trop mal 🙂
Acclamations,
Taylor
Si vous avez besoin pour ce faire sur Win32 pré-Vista ou Server 2008, regardez la
GetMappedFileName(...)
fonction, qui est l'un des secrets les mieux gardés de Win32. Avec un peu deC/C++-
fuvous pouvez la mémoire de la carte une petite partie du fichier en question, et de passer ensuite que la poignée de cette fonction.Aussi, sur Win32, vous ne pouvez pas supprimer un fichier qui est ouvert (open/dissocier problème mentionné dans une autre réponse) - vous pouvez le marquer pour suppression sur fermer, mais il va encore traîner jusqu'à son dernier handle ouvert est fermé. Je ne sais pas si la cartographie (via
mmap(...)
) le fichier dans ce cas serait de l'aide, car il a pour point de revenir à un fichier physique...-=- James.
Sur les unix il n'y a vraiment aucun moyen fiable de faire cela. Dans unix, avec le traditionnel système de fichiers unix, vous pouvez ouvrir un fichier puis de dissocier (supprimer son entrée à partir de l'annuaire) et de l'utiliser, à quel point le nom n'est pas stocké n'importe où. En outre, à cause d'un fichier peut avoir plusieurs liens physiques dans le système de fichiers, chacun de ces noms sont équivalentes, donc une fois que vous avez tout juste le handle ouvert, il ne serait pas savoir quel est le nom de fichier que vous devez carte de retour vers.
Ainsi, vous pouvez être en mesure de le faire sur Win32 l'aide d'autres réponses, mais si vous avez besoin de porter l'application unix ambiance, vous serez hors de la chance. Mon conseil pour vous est de revoir votre programme, si possible, de sorte que vous n'avez pas besoin de l'OS afin d'être en mesure de maintenir une ressource ouverte pour le nom de fichier de connexion.
Pour Windows Vista et les versions ultérieures, je préfère utiliser
GetFinalPathNameByHandle()
Pour Windows XP, je préfère le solution par Mehrdad.
Donc je charge GetFinalPathNameByHandle() de manière dynamique via GetProcAddress() et si cela ne fonctionne pas (parce que c'est Windows XP) je aller pour Mehrdad de la solution avec NtQueryObject()