J'ai les valeurs dwVolumeSerialNumber, nFileIndexHigh, nFileIndexLow obtenues à partir d'un appel à GetFileInformationByHandle. Comment puis-je obtenir le chemin du fichier à partir de ces valeurs?Comment obtenir le chemin du fichier à partir du numéro d'index NTFS?
Répondre
En raison de liens physiques, plusieurs chemins peuvent être mappés vers les numéros VolumeSerialNumber et FileIndex. Pour trouver tous ces chemins:
- volumes de Iterate pour trouver celui dont correspond le répertoire racine dwVolumeSerialNumber
- récursive énumérer tous les répertoires sur le volume, en sautant les liens symboliques et des points d'analyse, de trouver tous les fichiers avec correspondance nFileIndexHigh et nFileIndexLow.
Cela peut prendre beaucoup de temps. Si vous avez vraiment besoin de le faire aussi vite que possible et que votre système de fichiers est NTFS, vous pouvez lire l'intégralité de la MFT dans un tampon et l'analyser vous-même. Cela va obtenir tous les répertoires qui correspondent à l'intérieur d'une entrée MFT d'un seul coup. Le reste des répertoires peut être lu via le système d'exploitation ou également à travers des lectures brutes, en fonction de la quantité de travail que vous voulez faire. Mais de toute façon vous le regardez, c'est un lot de travail et ne s'applique même pas à FAT, FAT32 ou tout autre système de fichiers.
Une meilleure solution est probablement de rester sur le chemin d'origine si cela est possible.
Remarque: La question originale comportait une erreur. Maintenant que la question a été corrigée, cette réponse ne s'applique plus.
En général, vous ne pouvez pas. Les informations que vous avez récupérées vous indiquent le disque sur lequel le fichier se trouve et la taille de celui-ci. Il ne fournit pas suffisamment d'informations pour identifier le fichier réel. Plus précisément:
- dwVolumeSerialNumber identifie le volume et
- nFileSizeHigh et nFileSizeLow vous donner la taille du fichier
Si le fichier se trouve être le seul fichier sur ce volume est que la taille exacte , vous pouvez rechercher dans le volume un fichier de cette taille. Mais en général, c'est à la fois cher et peu fiable, donc je ne le recommande pas.
Ce MSDN article montre comment obtenir le chemin à partir d'un descripteur de fichier.
Vous utilisez OpenFileById pour ouvrir un fichier donné son ID de fichier, mais vous avez également besoin d'un fichier ouvert ailleurs sur le même volume, je suppose d'obtenir le numéro de série du volume.
This blog posting soulève un problème intéressant que vous devez passer en 24 pour la taille de la structure (élaboré en regardant le code d'assemblage). Je laisse comme un exercice intéressant (je ne trouvais pas de réponse facile) comment vous allez d'un dwVolumeSerialNumber à avoir un autre handle valide ouvert pour ce volume ou un fichier sur ce volume, mais peut-être que vous avez déjà assez informations pour votre cas. Une possibilité est d'itérer tous les volumes montés en appelant GetVolumeInformation pour trouver celui avec le numéro de série correspondant.Remarque: Si vous n'avez pas le fichier ouvert, vous ne pourrez peut-être pas utiliser le combo nFileIndexHigh/Low (ID de fichier aka) comme décrit dans le BY_HANDLE_FILE_INFORMATION Structure notes, qui avertit qu'il peut changer pour les systèmes FAT, mais Dans le système de fichiers NTFS, un fichier conserve le même ID de fichier jusqu'à sa suppression.
Notez que cette solution a quelques limitations. 'GetFinalPathNameByHandle()' (Vista et versions ultérieures) résout les liens symboliques et l'implémentation 'GetFileNameFromHandle()' (pour Windows XP) ne fonctionne pas avec les fichiers vides. – simonzack
- 1. obtenir le numéro à partir du fichier avec regexp?
- 2. comment obtenir le chemin du fichier à supprimer du serveur
- 3. Obtenir le chemin d'accès local à partir du chemin réseau
- 4. Comment extraire le nom du fichier à partir du nom du chemin du fichier?
- 5. obtenir le chemin du fichier à partir du fichier svn diff avec PHP et C
- 6. Eclipse RCP: Comment obtenir par programmation le numéro de version à partir du fichier du produit?
- 7. Comment obtenir le chemin d'accès du fichier exécutable du service
- 8. Obtenir le chemin réel du fichier téléchargé
- 9. Obtenir le chemin du fichier via javascript
- 10. obtenir le chemin du fichier txt
- 11. NSIS obtenir le chemin du fichier appelant
- 12. Comment obtenir le chemin complet du fichier à partir d'une entrée de fichier
- 13. Obtenir l'emplacement du chemin du fichier distant
- 14. Obtenir le chemin du fichier dans Java
- 15. Supprimer le chemin d'accès à partir du nom de fichier
- 16. Trouver le nom du fichier à partir du chemin complet du fichier
- 17. Comment obtenir le numéro majeur à partir du fichier de périphérique
- 18. Comment obtenir le chemin du fichier d'un CalCalendarItem?
- 19. Comment obtenir le chemin correct du fichier de configuration?
- 20. Comment obtenir le chemin complet du fichier css?
- 21. Créer le chemin du fichier à partir de variables
- 22. Comment obtenir le numéro du nœud sélectionné
- 23. Comment obtenir le chemin du fichier de ressources?
- 24. Comment obtenir le chemin du fichier .jar exécuté?
- 25. Comment obtenir le chemin du fichier d'une sélection iTunes
- 26. comment obtenir le chemin complet du fichier téléchargé
- 27. Obtenir le chemin d'accès complet sans nom de fichier à partir du chemin qui contient le nom de fichier
- 28. Sélectionner le chemin du fichier à dessiner
- 29. extrait le nom de fichier du chemin
- 30. obtenir le chemin d'ABS à partir du fichier en cours d'édition dans Eclipse
Pourquoi le downvote? La réponse est correcte, et je crois que c'est la meilleure réponse qui puisse être donnée. –
Erreur dans la description .. Je voulais dire nFileIndexHigh et nFileIndexLow, pas la taille du fichier. Fixé. – skevar7
Ok, c'est logique. Mais ma réponse n'a-t-elle pas été utile dans le sens où elle vous a fait réaliser l'erreur dans votre description? –