2010-09-03 3 views
3

J'ai une différence entre la taille des fichiers et l'espace disque utilisé (la taille totale du fichier dépasse même la taille du disque). Je suppose parce qu'il existe de nombreux liens durs (pour les composants WinSxS) dans Windows 7/Vista. Mais comment puis-je distinguer par programme les liens durs des vrais fichiers dans Windows 7?Comment est-ce que je peux distinguer par programme les liens durs des vrais dossiers dans Windows 7?

+0

double possible de [détecter les liens symboliques, points de jonction, points de montage et dur Liens] (http://stackoverflow.com/questions/ 2487237/detect-symbolic-links-points-de-jonction-points-de-montage-et-liens-durs) – mdb

Répondre

5

Vous ne pouvez pas, car tous les fichiers sont des liens durs. Pas vraiment. Un fichier est juste un lien dur à un morceau de données - une liste dans un répertoire. (Peut-être que vous voulez dire des liens symboliques? Vous pouvez pouvez les distinguer ...)

Utilisez les méthodes intégrées que Windows fournit pour calculer l'espace utilisé à la place.

EDIT: Reference (Souligné par)

Le lien lui-même est seulement une entrée de répertoire, et ne dispose pas d'un descripteur de sécurité. Par conséquent, lorsque vous modifiez le descripteur de sécurité d'un lien physique, vous modifiez le descripteur de sécurité du fichier sous-jacent et tous les liens matériels qui pointent vers le fichier autorisent l'accès nouvellement spécifié.

+0

Merci. Mais quelles sont les "méthodes intégrées de calcul de l'espace utilisé"? Est-il possible d'obtenir une vraie taille de fichiers (morceaux de données) sur le disque? – SKINDER

+0

Vous pouvez détecter si plusieurs noms pointent sur le même "bloc de données" ou "fichier" en appelant la fonction API Win32 GetFileInformationByHandle. Le membre nNumberOfLinks de la structure BY_HANDLE_FILE_INFORMATION renvoyée contient le nombre total de liens. –

2

Vous ne peut pas distinguer liens durs de fichiers « réels ». L'entrée de répertoire pour un "vrai fichier" est juste un autre lien dur. Peut-être que vous vouliez dire un lien symbolique.

POSIX a une fonction stat (appelée _stat dans Windows) qui peut détecter plusieurs liaisons vers le même fichier, qui aura le même numéro "inode".

+0

Notez que '_stat' et les amis sont spécifiques à MSVC ... Je ne crois pas que MinGW offre cette fonctionnalité. +1 pour répondre cependant. –

+0

L'API Windows a FindFirstFileNameW et FindNextFileNameW qui vous permet de détecter plusieurs liens durs vers le même fichier. Ce que je crois aura le même FRN (numéro de référence du fichier). –

1

Utilisez GetFileInformationByHandle() et vérifier le retour BY_HANDLE_FILE_INFORMATION nNumberOfLinks membre pour une valeur> 1.

+0

Mais si nNumberOfLinks vaut 1, cela ne signifie pas que ce fichier n'est pas un lien physique. – SKINDER

+0

Oui, il y a toujours un lien physique par définition comme mentionné dans la première réponse. Si vous créez un fichier nommé target.txt, puis créez 3 liens physiques vers ce fichier hlink1.txt, hlink2.txt, hlink3.txt, puis obtenir l'information pour l'un d'entre eux renverra nNumberOfLinks = 4. Si vous en supprimez 3, la finale le lien fixe restant retournera 1. Avec cette information, vous pouvez alors utiliser les membres nFileIndexLow/nFileIndexHigh de BY_HANDLE_FILE_INFORMATION pour ensuite distinguer l'utilisation de l'espace réel pour plusieurs liens pointant sur les mêmes données. – ribram

Questions connexes