J'ai commencé l'écriture, en Java, d'un outil de recherche de fichiers dupliqués. Je fais cela d'une part parce que les logiciels libres ou gratuits que j'ai trouvés ne me satisfont pas, et surtout parce que j'ai un programme à écrire pour valider une Unité d'Enseignement du CNAM.
J'ai, à force de recherche, trouvé comment éviter d'être piégé par les symlinks (et les alias ?) en utilisant la méthode getCanonicalFile de la classe File. C'est bien, ça évite de tomber dans des boucles infinies, notemment au niveau des répertoires, mais également pour éviter de comparer bêtement un fichier avec lui-même.
Le problème, c'est les hardlinks. En principe, ils ne sont pas permis pour les répertoires, la norme Posix l'interdit, mais dans les faits ça peut exister. Et même sans parler des répertoires, si on ne tient pas compte des hardlinks pour les fichiers, le risque est que mon outil se retrouve dans la situation ridicule de comparer un fichier avec lui-même.
Bien sûr, je sais que c'est un brin futile d'écrire un logiciel de cette nature en Java, il vaudrait mieux l'écrire, par exemple, en C++, où je pourrais utiliser directement l'inode (sous Linux, parce que sous Windows en NTFS - où les hardlinks existent - je sais pas trop) pour éviter le problème.
Mais je n'ai pas le temps de me mettre à jour en matière d'interfaces graphiques pour faire ça en C++ voire en C.
Existe-t-il un moyen d'éviter le problème ? Pour l'heure, j'envisage un compteur de profondeur d'exploration qui envoit un message d'alerte si quelque chose d'anormal se produit (genre une arborescence de plus de 20 niveaux de profondeur c'est suspect), mais existe-t-il, à votre connaissance, en Java, un moyen de ne pas tomber dans ce piège ?
Partager