2010-09-12 20 views
14

Comment puis-je récupérer tous les noms de fichiers correspondant à un modèle dans un répertoire? J'ai essayé ceci mais il retourne le chemin complet au lieu du nom de fichier.Comment puis-je récupérer tous les noms de fichiers dans un répertoire?

Directory.GetFiles (path, "*.txt") 

Dois-je recadrer manuellement le chemin du répertoire? Il est facile, mais peut-être il y a une encore plus simple solution :)

+1

En utilisant ce langage? –

+0

(Encore de nouvelles idées à venir donc je déciderai plus tard de la réponse acceptée.) – mafu

Répondre

31
foreach (string s in Directory.GetFiles(path, "*.txt").Select(Path.GetFileName)) 
     Console.WriteLine(s); 
+2

+1 pour utiliser Linq – Giorgi

+0

@mafutrct: Avez-vous essayé la version de Grif? –

+0

Oh, wow, je m'excuse. Je ne savais pas que c'était possible. C'est incroyable, merci beaucoup de montrer! – mafu

3

Utilisez Path.GetFileName avec votre code:

foreach(var file in Directory.GetFiles(path, "*.txt")) 
{ 
    Console.WriteLine(Path.GetFileName(file)); 
} 

Une autre solution:

DirectoryInfo dir = new DirectoryInfo(path); 
var files = dir.GetFiles("*.txt"); 
foreach(var file in files) 
{ 
    Console.WriteLine(file.Name); 
} 
+0

GetFileName (file.Name) probablement sans le '.Name'? – mafu

+0

Oui, sans le '.Name'. Si vous regardez http://msdn.microsoft.com/en-us/library/07wt70x2.aspx, vous verrez qu'il renvoie des chaînes, pas 'FileInfo'. –

+0

Plutôt que de me plaindre, je l'ai édité pour que ce soit correct. Cherchez ma facture par la poste. –

1

Vous pouvez utiliser le code suivant pour obtenir les noms de fichiers:

DirectoryInfo info = new DirectoryInfo("C:\Test"); 
    FileInfo[] files = info.GetFiles("*.txt"); 

    foreach(FileInfo file in files) 
    { 
     string fileName = file.Name; 
    } 
+2

Ce qui n'est pas génial à ce propos, c'est qu'il instancie des instances FileInfo pour chaque fichier. Le constructeur doit effectuer des E/S significatives afin de pré-remplir les attributs et d'autres champs de ce type, ce qui représente beaucoup de frais généraux évitables. –

11

En supposant que vous utilisez C#, la classe DirectoryInfo sera plus utile o vous:

DirectoryInfo directory = new DirectoryInfo(path); 
FileInfo[] files = directory.GetFiles("*.txt"); 

La classe FileInfo contient une propriété Name qui renvoie le nom sans le chemin. Pour plus d'informations, voir the DirectoryInfo documentation et the FileInfo documentation pour plus d'informations.

+0

Comme sidenote: .NET 4.0 vous pouvez obtenir un énumérateur et sont plus rapides/en utilisant moins de mémoire que l'approche de tableau lorsque vous avez de nombreux fichiers. – TomTom

+0

@Tom Je doute fortement que cela soit nécessairement vrai lorsqu'il s'agit de fichiers. Par exemple, êtes-vous sûr de créer un DirectoryInfo (qui est de loin un objet plus complexe que la chaîne de Directory.GetFiles) ne l'emporte pas sur ce petit avantage (Enumerator vs Array) facilement? --- Cependant, cela n'a pas vraiment d'importance dans mon cas, car la lecture du contenu du fichier l'emporte facilement sur la récupération des noms de fichiers. – mafu

+0

Même problème ici qu'avec la réponse de Genady Sergeev: 'FileInfo' a beaucoup de surcharge que vous ne voulez probablement pas. –

7

Voulez-vous passer en revue à travers les sous-répertoires? Utilisez Directory.EnumerateFiles:

var fileNames = Directory.EnumerateFiles(@"\", "*.*", SearchOption.AllDirectories); 
+1

C'est le moyen le plus efficace lorsque vous allez parcourir de nombreux répertoires, car il revient immédiatement au lieu d'essayer de tout charger en mémoire. C'est nouveau pour .NET 4.0. –

+0

+1 Ne savait pas à ce sujet – mafu

1
var filenames = Directory.GetFiles(@"C:\\Images", "*.jpg"). 
       Select(filename => Path.GetFileNameWithoutExtension(filename)). 
       ToArray(); 

Essayez ceci s'il est ce que vous voulez

0

Essayez cette

IEnumerable<string> fileNames = 
       Directory.GetFiles(@"\\srvktfs1\Metin Atalay\", "*.dll") 
        .Select(Path.GetFileNameWithoutExtension);