Partage
  • Partager sur Facebook
  • Partager sur Twitter

[W10] Fichiers "invisibles" (Char non-latins)

7 janvier 2020 à 6:43:33

Yop.

Je me retrouve avec un curieux "problème" : je bosse actuellement sur un programme qui, à certains moments compare des répertoires entre eux, pour vérifier qu'ils contiennent exactement le même contenu à l'octet près.

Souci : j'ai présentement deux répertoires qui contiennent exactement 838 fichiers, tous identiques, mais quand je lance mon programme, j'ai toujours 4 fichiers qui sont indiqués comme manquants dans le répertoire de départ. Ce qui n'a aucun sens, puisque les deux répertoires ont évidemment le même nombre de fichiers, la même taille, etc, et donc 4 fichiers manquants d'un côté devrait signifier, dans le pire des cas, 4 fichiers manquants de l'autre également.

Les fichiers concernés ont été identifiés : il s'agit de tous les fichiers contenant des caractères non-latins, et renommer les fichiers suffit à tout faire rentrer dans l'ordre. Tant qu'ils ont leurs noms d'origine, on dirait qu'ils sont comptés en double, mais toutes leurs copies n'occupent aucune place, pas même dans le décompte du répertoire.

La question qui en résulte est donc : comment éliminer ces fichiers fantômes en conservant mes caractères non-latins dans les titres ?

  • Partager sur Facebook
  • Partager sur Twitter
7 janvier 2020 à 23:44:56

Salut,
Est-ce ton programme qui lit les deux dossiers et qui compte les fichiers?
Si c'est l'explorateur de fichiers, il ne tient pas compte des fichiers cachés alors qu'un programme peut en général les voir.
Ton programme est écrit en quel langage? Si c'est en C, quels fonctions utilises-tu pour lire les dossiers?
Quand tu parles de caractères "non latins", tu fais allusion à quels caractères?
Windows est très capricieux sur le code des caractères. Si tu passes en mode commande avec cmd et que tu fais un chcp, tu obtiens quoi comme code?
» mais toutes leurs copies n'occupent aucune place, pas même dans le décompte du répertoire
Ça veut dire quoi "dans le décompte du répertoire"?
Même si ce sont des dossiers considérés comme identiques, les entrées ne sont pas nécessairement placées dans le même ordre dans les deux dossiers.
Donc, si tu ne les tries pas, tu peux te faire jouer un tour et penser que les fichiers sont manquants.
J'avoue que le fait que si tu les renommes et que cela semble corriger le problème m'intrigue.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

8 janvier 2020 à 8:01:34

Yop.

C'est bien mon programme qui lit les fichiers, il est encore en phase de prototypage donc il est écrit en Perl 5, et utilise la librairie File::Find. Si je passe par l'explorateur de fichiers, il n'y a aucune anomalie.

Les caractères non-latins sont en cyrillique, dans la très grande majorité.

Je connais pas chcp, ça affiche 437, que les fichiers concernés soient présents ou non.

Quand je parle de "décompte du répertoire", je parle du nombre de fichiers qui y sont présents : ils sont comptés pendant le parcours du répertoire, mais malgré les alertes sur les fichiers "fantômes", ceux-ci n'incrémentent pas le compteur.

  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2020 à 17:48:26

Ça fait longtemps que je n'ai rien écrit en Perl. Je ne faisais pas ce genre de choses.
Est-ce la librarie File::Find ou ton programme qui donne les alertes? Il y a probablement un code d'erreur qui est retourné par les fonctions utilisées.
Est-ce que tu vérifie ce code et fait la différence entre les codes retournés?
chcp ne fonctionne qu'en mode console avec le programme cmd ou PowerShell. Si tu ne les utilises pas, ça ne te donneras rien.
Mais si tu es sur Windows comme supposé, comment pourrais-tu utiliser Perl autrement?
Je ne connais pas l'alphabet cyrillique. Y a-t-il des caractères du genre 'ì' ou 'ä' comme en finnois?
Je n'ai pas de difficulté pour gérer les caractères accentués français en général (je travaille en C).
Si tu te places devant chacun des deux dossiers et que tu vas dans le Menu contextuel (bouton droit de la souris ou Shift+F10) et que tu vas dans l'option Propriétés, tu devrais voir la grandeur totale de tes dossiers au caractère près.
Si elles sont identiques, il faudrait reviser ton programme.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

8 janvier 2020 à 18:58:13

En toute logique, les problèmes viennent de la librairie File::Find : les alertes sortent bien de mon programme, mais c'est la librairie qui cherche les fichiers. (Donc, aucun code d'erreur. Quand je parle d'"alertes", ce sont les warn que j'ai configuré moi-même.)

Ceci dit, je viens de trouver une piste : un glob (testé en Perl et en C) sur le même répertoire ne trouve que les fichiers "invisibles", pas les fichiers avec des char cyrilliques. (Je n'ai pas encore testé si je pouvais ouvrir ces fichiers.). Idem pour un readdir. Donc, il va falloir que j'aille fouiller comment la librairie est écrite, si je veux éclaircir ce mystère.

C'est bien en powershell que j'ai utilisé chcp, et ça donne toujours 437 (Avec ou sans fichiers incriminés.)

Pour l'alphabet cyrillique, c'est plus éloigné du latin que le finnois, les différences ne se limitent pas aux diacritiques, et même les caractères similaires ne correspondent pas aux mêmes codes. Je viens de tester : un fichier avec ì ou ä ne cause aucune anomalie, pas plus que les é, è, ø...

Et du coup, comme attendu, dans Propriétés, les répertoires font toujours la même taille. (Et chaque fichier a la même signature md5 entre les deux répertoires. On ne peut guère faire plus identique.)

Information supplémentaire, que j'ai pas précisé plus tôt, mais ça peut avoir un intérêt : ces "fichiers fantômes" n'apparaissent que sur le répertoire situé sur un support amovible. J'ai même essayé de switch le contenu des répertoires en les renommant et les inversant, mais rien à faire : l'erreur n'apparaît TOUJOURS que sur le répertoire situé sur le support externe.

  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2020 à 1:51:36

Je suis également avec W10 et mon chcp me donne 850 par défaut. J'avais 1252 sur W8.1 et je me mets souvent avec 65001 pour le utf-8 dans cmd.
Comme je l'ai dit, Windows est compliqué sur les codes des caractères.
Si tu utilises 'rddir' également, tu devrait pouvoir tester les codes des noms de fichiers.
Utilises-tu les fonctions 'stat' et '_stat' pour obtenir plus d'informattion sur le type de fichier et les permissions?
As-tu des fichiers "fantômes" avec rddir? Obtient-tu le même nombre de fichiers avec rddir et File::Find?
Je peux lire tous mes dossiers avec rddir, y compris les dossiers avec des noms bizarres sur C:\
J'ai pensé que si un des dossiers était sur un média externe, il y avait une conversion quelconque, mais si ta signature est la même, c'est plus gênant.
L'idée étant que si ton média est amovible, tu pourrais en théorie le brancher sur tout autre système que Windows.
Mais, je doute de ma théorie ...
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.