2010-09-12 56 views
14

¿Cómo recupero todos los nombres de archivo que coinciden con un patrón en un directorio? Intenté esto pero devuelve la ruta completa en lugar del nombre del archivo.¿Cómo recupero todos los nombres de archivos en un directorio?

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

¿Tengo que cortar manualmente la ruta del directorio fuera del resultado? Es fácil, pero tal vez hay una solución aún más simple :)

+1

El uso de idioma? –

+0

(Aún vienen nuevas ideas, así que decidiré más adelante sobre la respuesta aceptada). – mafu

Respuesta

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

+1 para usar Linq – Giorgi

+0

@mafutrct: ¿Has probado la versión de Grif? –

+0

Oh, wow, me disculpo. No sabía que esto es posible. Esto es increíble, ¡muchas gracias por mostrar! – mafu

3

Uso Path.GetFileName con su código:

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

Otra solución:

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

GetFileName (file.Name) probablemente sin el '.Name'? – mafu

+0

Sí, sin el '.Name'. Si miras en http://msdn.microsoft.com/en-us/library/07wt70x2.aspx, verás que devuelve cadenas, no 'FileInfo'. –

+0

En lugar de quejarme, lo he editado para que sea correcto. Busque mi factura en el correo. –

1

Usted puede utilizar el código siguiente para obtener los nombres de archivo:

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

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

Lo que no es tan bueno acerca de esto es que crea instancias de FileInfo para cada archivo. El constructor tiene que hacer una E/S significativa para precompletar los atributos y otros campos similares, por lo que se trata de una sobrecarga totalmente evitable. –

11

Suponiendo que está utilizando C#, la clase DirectoryInfo será de más uso t O usted:

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

La clase FileInfo contiene una propiedad Name que devuelve el nombre sin la ruta.

Consulte the DirectoryInfo documentation y the FileInfo documentation para obtener más información.

+0

Como nota al margen: en .NET 4.0 puede obtener un enumerador y es más rápido/usa menos memoria que el enfoque de matriz cuando tiene muchos archivos. – TomTom

+0

@Tom No estoy seguro de que esto sea necesariamente cierto cuando se trata de archivos. Por ejemplo, ¿está seguro de que la creación de un DirectoryInfo (que es un objeto mucho más complejo que la cadena de Directory.GetFiles) no supera con creces esa pequeña ventaja (Enumerator vs Array)? --- Sin embargo, en realidad no importa en mi caso, ya que leer el contenido del archivo nuevamente supera con creces la recuperación de los nombres de los archivos. – mafu

+0

El mismo problema aquí que con la respuesta de Genady Sergeev: 'FileInfo' tiene una sobrecarga que probablemente no desee. –

7

¿Desea recurse a través de subdirectorios? Utilice Directory.EnumerateFiles:

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

Esta es la manera más eficiente cuando vas a ir a través de muchos directorios, ya que regresa inmediatamente en lugar de intentar cargar todo en la memoria. Es nuevo para .NET 4.0. –

+0

+1 No sabía sobre esto – mafu

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

probar este si es lo que quiere

0

probar este

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