[Tips] Directory.GetFiles renvoie des résultats differents en fonction des machines

Rien n’est simple ni facile en informatique, et le jour où j’ai constaté qu’un Directory.GetFiles tout bête me renvoyait des résultats différents pour une même liste de fichiers présents en local sur ces serveurs n’a fait que confirmer cet état de fait !

J’ai eu cette désagréable surprise en effectuant un simple Directory.GetFiles(monpath, « *.pdf »)

La documentation https://msdn.microsoft.com/fr-fr/library/ms143316(v=vs.110).aspx indique que lorsque l’on fait un GetFiles avec un filtre sur une extension contenant 3 caractères, tous les fichiers ayant une extension débutant par cette extension sont renvoyés.

When you use the asterisk wildcard character in a searchPattern such as « *.txt », the number of characters in the specified extension affects the search as follows:

  • If the specified extension is exactly three characters long, the method returns files with extensions that begin with the specified extension.For example, « *.xls » returns both « book.xls » and « book.xlsx ».

Ainsi un Directory.GetFiles(monpath, « *.pdf ») renvoie tous les fichiers qui ont une extension qui débute par .pdf. Ainsi les fichiers “.pdf” mais également les fichiers ayant une extension “.pdfa” sont renvoyés.

Cette règle indiquée dans la documentation est vraie mais uniquement si le format 8.3 des fichiers est activé !

La gestion du format 8.3 des fichiers peut en effet être désactivé pour des raisons de performances (cf https://blogs.technet.microsoft.com/josebda/2012/11/13/windows-server-2012-file-server-tip-disable-8-3-naming-and-strip-those-short-names-too/). Si tel est le cas, la méthode GetFiles aura un comportement différent, et ne renverra pas la même liste de fichiers. La recherche sera effectué en respectant exactement le filtre sans prendre en compte les extensions de plus de 3 caractères.

Dans mon cas, mon application étant déployée sur deux serveurs différents ayant deux paramétrages différents, des résultats différents sont renvoyés avec malheureusement un impact fonctionnel malencontreux Smile

Pour savoir si votre lecteur a le format 8.3 d’activé, faites un dir /X sur un dossier qui contient un ou plusieurs fichiers ayant un nom long, et regardez si une colonne contenant le nom court apparaît. Si ce n’est pas le cas, le format 8.3 est désactivé.

Format 8.3 activé :

clip_image001

Format 8.3 désactivé :

clip_image002

Les noms de fichiers sont longs (dépassent 8 caractères) et n’ont pas d’équivalence au format court, le format 8.3 est donc désactivé sur ce lecteur

Si vous souhaitez avoir un même comportement quel que soit le disque dur, il est donc nécessaire d’effectuer un second filtre de ce type :

Directory.GetFiles(directory, « *.pdf »).Where(item => item.EndsWith(« .pdf »));

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *