2009-09-28 9 views
4
string[] fileEntries = Directory.GetFiles(pathName, "*.xml"); 

renvoie également les fichiers comme foo.xml_ est-il un moyen de forcer à ne pas le faire, ou devrai-je écrire du code pour filtrer les résultats de retour.Arrêter caractère générique implicite dans Directory.GetFiles()

C'est le même comportement que dir *.xml à l'invite de commande, mais différent de la recherche de *.xml dans Windows Explorer.

Répondre

4

Ce problème est inhérent à conception. De MSDN (voir la section des notes et des exemples donnés):

A searchPattern avec une extension de fichier d'exactement trois caractères retourne fichiers ayant une extension de trois ou plus de caractères, où les trois premiers caractères correspondent à l'extension de fichier spécifiée dans la rechercheModèle.

Vous pouvez limiter comme suit:

C# 2.0:

string[] fileEntries = Array.FindAll(Directory.GetFiles(pathName, "*.xml"), 
    delegate(string file) { 
     return String.Compare(Path.GetExtension(file), ".xml", StringComparison.CurrentCultureIgnoreCase) == 0; 
    }); 
// or 
string[] fileEntries = Array.FindAll(Directory.GetFiles(pathName, "*.xml"), 
    delegate(string file) { 
     return Path.GetExtension(file).Length == 4; 
    }); 

C# 3.0:

string[] fileEntries = Directory.GetFiles(pathName, "*.xml").Where(file => 
    Path.GetExtension(file).Length == 4).ToArray(); 
// or 
string[] fileEntries = Directory.GetFiles(pathName, "*.xml").Where(file => 
    String.Compare(Path.GetExtension(file), ".xml", 
     StringComparison.CurrentCultureIgnoreCase) == 0).ToArray(); 
+0

Toute idée de la raison de ce comportement apparemment bizarre? Héritage 8.3 choses de nom de fichier? –

+0

Je cible le framework 2.0 donc je ne peux pas utiliser la syntaxe =>. –

+0

@Dan: code mis à jour pour utiliser un délégué anonyme. @Jon Seigel: oui, c'est correct. Une autre remarque sur le lien MSDN mentionne que la méthode "vérifie les noms de fichier avec le format de nom de fichier 8.3 et le format de nom de fichier long." –

2

il est dû à la méthode de recherche 8.3 des fenêtres . Si vous essayez de rechercher "* .xm", vous obtiendrez 0 résultats.

vous pouvez utiliser dans .net 2.0:

string[] fileEntries = 
Array.FindAll<string>(System.IO.Directory.GetFiles(pathName, "*.xml"), 
      new Predicate<string>(delegate(string s) 
      { 
       return System.IO.Path.GetExtension(s) == ".xml"; 
      })); 
Questions connexes