2010-05-26 16 views
11

Necesito obtener el primer nombre de archivo de una carpeta. ¿Cómo puedo obtener esto en C#?Cómo tomar el primer nombre de archivo de una carpeta en C#

El código siguiente devuelve todos los nombres de archivo:

DirectoryInfo di = new DirectoryInfo(imgfolderPath); 
foreach (FileInfo fi in di.GetFiles()) 
{ 
    if (fi.Name != "." && fi.Name != ".." && fi.Name != "Thumbs.db") 
    { 
     string fileName = fi.Name; 
     string fullFileName = fileName.Substring(0, fileName.Length - 4); 

     MessageBox.Show(fullFileName); 
    } 
} 

necesito el primer nombre de archivo.

+7

Si acepta algunas de las respuestas a sus otras preguntas, las personas serán más propensas a ayudarlo. –

+0

Un título mejor podría ser algo así como: "Cómo buscar un nombre de archivo que coincida con un predicado de una carpeta en C#" –

+1

¿Qué versión de .NET estás usando? –

Respuesta

24

Hay algunas maneras que usted puede hacer esto:

  • Se podría añadir una declaración break después de manipular el primer archivo. Esto saldrá del ciclo foreach.

  • DirectoryInfo.GetFiles devuelve una matriz para que pueda asignarla a una variable y escanear a través de los elementos hasta que encuentre un elemento adecuado.

  • O si está usando .NET 3.5 podría mirar el método FirstOrDefault con un predicado.

Aquí hay algo de código:

string firstFileName = 
    di.GetFiles() 
     .Select(fi => fi.Name) 
     .FirstOrDefault(name => name != "Thumbs.db"); 
+0

oh gracias ... pero yo estaba tratando de declarar array y blay bala .. de todos modos gracias – riad

+0

Respuestas más aceptables ... gracias hermano. – riad

+0

Dado que 'GetFiles' enumera todos los archivos en el directorio para crear una matriz, sería más eficiente usar' EnumerateFiles' en este caso. Para obtener más información, consulte https://msdn.microsoft.com/en-us/library/wz42302f(v=vs.110).aspx – Vlad

4
FileInfo fi = di.GetFiles()[0]; 

Notas:

  • El código produce una excepción si no hay archivos.
  • "Primero" es ambiguo, ¿se refiere a cualquier archivo, o al primero alfabéticamente? En este último caso, es posible que deba preocuparse por cuestiones como la distinción entre mayúsculas y minúsculas y la ordenación dependiente de la configuración regional.
1
using System.IO; 
using System.Linq; 

var firstFile = Path.GetFileName(Directory.GetFiles(@"c:\dir", "*.*") 
    .FirstOrDefault(f => !String.Equals(
     Path.GetFileName(f), 
     "Thumbs.db", 
     StringComparison.InvariantCultureIgnoreCase))); 
+0

. ¿No debería proporcionar la ruta completa a la lambda para obtener la cláusula Where? ¿trabajar? ¿Sólo curioso? :) – Henric

+0

Nota: No necesita una llamada separada a Where - FirstOrDefault puede aceptar un predicado. –

+0

Es cierto, @Mark Byers, y no creo que el código anterior haga lo que se requiere o no entiendo algo? Directory.GetFiles() devuelve una cadena que contiene las rutas completas como los nombres de los archivos, por lo que también debería tener esto en cuenta en el predicado. – Henric

1

En respuesta a Riad de comentar a mí:

Además de la solución de abatischchev:

var file = Directory.GetFiles(@"C:\TestFolder", "*.*") 
      .FirstOrDefault(f => f != @"C:\TestFolder\Text1.txt"); 

Yo añadiría esto para obtener sólo el nombre:

Console.WriteLine(file.Substring(file.LastIndexOf('\\') + 1)); 

que genera la salida Text2.txt (tengo tres ti texto les en esa carpeta llamada Text1.txt, Text2.txt y text3.txt.

6

Si está utilizando .Net 4.0 que debe hacer esto en su lugar ...

var firstFileName = di.EnumerateFiles() 
         .Select(f => f.Name) 
         .FirstOrDefault(); 

... .GetFiles() crea una matriz y como tal debe analizar todos los archivos. .EnumerateFiles() devolverá un IEnumerable<FileInfo> por lo que no tiene que hacer tanto trabajo. Probablemente no notará demasiada diferencia en un disco duro local con una pequeña cantidad de archivos. Pero un recurso compartido de red, memoria USB/tarjeta de memoria o una gran cantidad de archivos lo haría obvio.

+0

, tal vez obtener "Thumbs.db"?! eso no está bien. –

+1

¿Qué? Si está buscando un archivo en particular, agregue la cadena de búsqueda. si solo estás haciendo una manta, obtén el primer archivo, y si eso es 'thumbs.db', ​​entonces eso es todo. De cualquier forma, '.EnumerateFiles (...)' solo devolverá los archivos de uno en uno, lo que es realmente útil en directorios con toneladas de archivos y carpetas. https://msdn.microsoft.com/en-us/library/system.io.directoryinfo.enumeratefiles(v=vs.110).aspx –

+0

Hola. Tienes razón. Yo usando esta solución => http://stackoverflow.com/a/2912435/1395101 pero no es interesante? porque se puede devolver "*. Cualquier extensión de archivo" y necesito que se devuelva el código primero solo como archivo .jpg. al final encontré esta solución => http://stackoverflow.com/a/3152180/1395101 –

Cuestiones relacionadas