2012-01-10 2 views
6

J'ai récemment tombé sur une fonctionnalité bizarre de Microsoft:fonctionnalité bizarre dans les Directory.GetFiles de .NET() lorsque motif de recherche contient 3 caractères pour l'extension

Supposons que notre dossier c:\tmp123 contient 3 fichiers -
1.txt
2.txtx
3.txtxt

a) L'invocation de Directory.GetFiles(@"C:\tmp123", "*.txt") donne 3 éléments retournés.
b) L'invocation de Directory.GetFiles(@"C:\tmp123", "*.txtx") donne 1 articles retournés. Selon Microsoft, il s'agit du comportement attendu (voir la remarque dans MSDN).

Mes questions sont les suivantes:

  1. Pourquoi Microsoft at-il décider d'avoir une telle fonctionnalité étrange?

  2. Comment puis-je résoudre ce problème?
    Par exemple, comment puis-je avoir un motif de recherche qui renvoie uniquement l'extension *.txt et qui ne renvoie pas *.txtx, *.txtstarngefunctionality, etc.?

Répondre

0

Je serais prêt à parier que c'est quelque chose à voir avec la rétrocompatibilité. Je ne vois pas cette question exacte mentionné, mais this Raymond Chen blogpost mentionne un certain nombre de bizarreries dans ce domaine:

[...] quelques bizarreries de l'algorithme de correspondance persistent dans FCB Win32, car ils sont devenus idiome. Par exemple, si votre motif se termine par .*, le .* est ignoré. Par exemple, si votre motif se termine par .*, il est ignoré.Sans cette règle, le modèle *.* ne correspondrait qu'à fichiers contenant un point, ce qui briserait probablement 90% de tous les fichiers batch sur la planète, ainsi que la mémoire musculaire de tout le monde, puisque tout le monde qui exécute Windows NT 3.1 a grandi dans un monde où *.* signifiait tous les fichiers.

Comme autre exemple, un motif qui se termine par un point ne correspond pas réellement à des fichiers qui se terminent par un point; il correspond aux fichiers sans extension. Et un point d'interrogation peut correspondre à zéro caractères s'il vient immédiatement avant un point.

2

La raison en est la rétrocompatibilité.

Windows a été initialement construit comme une interface graphique au-dessus de MSDOS qui avait seulement des fichiers avec 8 caractères pour le nom et un maximum de 3 pour l'extension. Les extensions aux systèmes de fichiers MSDOS ont permis à Windows d'avoir des noms de fichier et des extensions plus longs, mais ceux-ci apparaîtraient toujours comme des noms de fichiers 8.3 dans MSDOS.Comme l'invite de commande sous Windows est une évolution de l'ancien interpréteur de commande dans MSDOS, certains comportements "anachroniques" (comme le motif de recherche à 3 lettres) ont été conservés pour que les applications et les scripts soient construits dans "l'ancien temps" ou "les anciens" ne casseraient pas.

(un autre exemple est le fait la plupart des fenêtres systèmes de fichiers sont insensibles à la casse, oui, vous l'aurez deviné, parce que le MSDOS n'a pas boîtier)

+0

(NTFS peut être [sensible à la casse] (http://support.microsoft.com/kb/100625)) –

1

Si vous voulez une solution de contournement, vous pouvez simplement récupérer tous les fichiers chemins

var files = Directory.GetFiles(@"C:\tmp123"); 

puis les filtrer par extension au besoin

var txtFiles = files.Where(f => f.EndsWith(".txt")); 
var txtxFiles = files.Where(f => f.EndsWith(".txtx")); 
0

Voici une autre solution qui aidera à filtrer les fichiers wi les extensions telles que ".txtxt":

var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt"); 
Questions connexes