C # obteniendo nombres de archivos sin extensiones

Al obtener nombres de archivos en una determinada carpeta:

DirectoryInfo di = new DirectoryInfo(currentDirName); FileInfo[] smFiles = di.GetFiles("*.txt"); foreach (FileInfo fi in smFiles) { builder.Append(fi.Name); builder.Append(", "); ... } 

por fi.Name obtenemos un nombre de archivo con su extensión: file1.txt , file2.txt , file3.txt

¿Qué mejor que obtener los nombres de archivo sin las extensiones de archivo file1 , file2 , file3 ?

Puede usar Path.GetFileNameWithoutExtension :

 foreach (FileInfo fi in smFiles) { builder.Append(Path.GetFileNameWithoutExtension(fi.Name)); builder.Append(", "); } 

Aunque me sorprende que no haya una forma de obtener esto directamente de FileInfo (o al menos no puedo verlo).

Use Path.GetFileNameWithoutExtension() .

Esta solución también evita la adición de una coma final.

 var filenames = String.Join( ", ", Directory.GetFiles(@"c:\", "*.txt") .Select(filename => Path.GetFileNameWithoutExtension(filename))); 

No me gusta el DirectoryInfo, FileInfo para este escenario.

DirectoryInfo y FileInfo recostackn más datos sobre la carpeta y los archivos que los necesarios para que les lleve más tiempo y memoria de la necesaria.

Use Path.GetFileNameWithoutExtension . La ruta está en el espacio de nombres System.IO.

Como respuesta adicional (o para comstackr en las respuestas existentes) puede escribir un método de extensión para lograr esto para usted dentro de la clase DirectoryInfo. Aquí hay una muestra que escribí bastante rápido que podría embellecerse para proporcionar nombres de directorio u otros criterios para la modificación, etc.

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace DocumentDistributor.Library { public static class myExtensions { public static string[] GetFileNamesWithoutFileExtensions(this DirectoryInfo di) { FileInfo[] fi = di.GetFiles(); List returnValue = new List(); for (int i = 0; i < fi.Length; i++) { returnValue.Add(Path.GetFileNameWithoutExtension(fi[i].FullName)); } return returnValue.ToArray(); } } } 

Editar: También creo que este método probablemente podría simplificarse o sorprenderse si utilizara LINQ para lograr la construcción de la matriz, pero no tengo la experiencia en LINQ para hacerlo lo suficientemente rápido para una muestra de este tipo.

Edit 2 (casi 4 años después): Aquí está el método LINQ-ified que usaría:

 public static class myExtensions { public static IEnumerable GetFileNamesWithoutExtensions(this DirectoryInfo di) { return di.GetFiles() .Select(x => Path.GetFileNameWithoutExtension(x.FullName)); } } 
 Path.GetFileNameWithoutExtension(file); 

Esto devuelve el nombre del archivo solo sin el tipo de extensión. También puede cambiarlo para obtener el nombre y el tipo de archivo

  Path.GetFileName(FileName); 

fuente: https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx

FileInfo conoce su propia extensión, por lo que podría simplemente eliminarla

 fileInfo.Name.Replace(fileInfo.Extension, ""); fileInfo.FullName.Replace(fileInfo.Extension, ""); 

o si eres paranoico porque podría aparecer en el medio, o quieres micro-optimizar:

 file.Name.Substring(0, file.Name.Length - file.Extension.Length) 

si el nombre del archivo contiene el directorio y no necesita perder el directorio:

 fileName.Remove(fileName.LastIndexOf(".")) 

Para que conste:

DirectoryInfo di = new DirectoryInfo(currentDirName); FileInfo[] smFiles = di.GetFiles("*.txt"); string fileNames = String.Join(", ", smFiles.Select(fi => Path.GetFileNameWithoutExtension(fi.FullName)));

De esta manera no utiliza StringBuilder sino String.Join() . Además, tenga en cuenta que Path.GetFileNameWithoutExtension() necesita una ruta de acceso completa ( fi.FullName ), no como vi en una de las respuestas fi.Name .

 using System; using System.IO; public class GetwithoutExtension { public static void Main() { //D:Dir dhould exists in ur system DirectoryInfo dir1 = new DirectoryInfo(@"D:Dir"); FileInfo [] files = dir1.GetFiles("*xls", SearchOption.AllDirectories); foreach (FileInfo f in files) { string filename = f.Name.ToString(); filename= filename.Replace(".xls", ""); Console.WriteLine(filename); } Console.ReadKey(); } }