2011-01-26 14 views
187

Quando si ottiene i nomi dei file in una determinata cartella:C# ottenere i nomi dei file senza estensioni

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

da fi.Name otteniamo un nome di file con la sua estensione: file1.txt, file2.txt, file3.txt

Quale modo migliore per ottenere il file nomi senza estensioni di file file1, file2, file3?

risposta

342

È possibile utilizzare Path.GetFileNameWithoutExtension:

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

Anche se io sono sorpreso, non c'è un modo per ottenere questo direttamente dal FileInfo (o almeno non riesco a vederlo).

+5

E per ottenere l'estensione (per aggiungere in seguito per esempio) utilizzare: Path.GetExtension (fileName); – Justin

+1

@Juzzz Questo è utile se si sta lavorando con una stringa nuda, ma se si dispone già di un oggetto FileInfo, non è necessario preoccuparsi di Path. FileInfo fornisce già la proprietà "Estensione" per lo scopo. – jmbpiano

+0

Ho ricevuto l'errore "'builder' non esiste nel contesto corrente". Ho aggiunto "system.Text" ma ho ancora lo stesso errore. Qual è il motivo? – ffttyy

7

Utilizzare Path.GetFileNameWithoutExtension. Il percorso è nello spazio dei nomi System.IO.

5

Come risposta aggiuntiva (o per aggravare le risposte esistenti) è possibile scrivere un metodo di estensione per eseguire questo per voi all'interno della classe DirectoryInfo. Ecco un esempio che ho scritto abbastanza rapidamente che potrebbe essere abbellita per fornire i nomi delle directory o altri criteri di modifica, ecc:

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<string> returnValue = new List<string>(); 

      for (int i = 0; i < fi.Length; i++) 
      { 
       returnValue.Add(Path.GetFileNameWithoutExtension(fi[i].FullName)); 
      } 

      return returnValue.ToArray<string>(); 
     } 
    } 
} 

Edit: Penso anche che questo metodo potrebbe probabilmente essere semplificato o awesome-ified se ha usato LINQ per realizzare la costruzione dell'array, ma non ho esperienza in LINQ per farlo abbastanza velocemente per un campione di questo tipo.

Edit 2 (quasi 4 anni dopo): Ecco il metodo LINQ ified userei:

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

Questa soluzione impedisce anche l'aggiunta di una virgola finale.

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

Non mi piace DirectoryInfo, FileInfo per questo scenario.

DirectoryInfo e FileInfo raccolgono più dati sulla cartella e sui file di quanto sia necessario in modo che richiedano più tempo e memoria del necessario.

+2

+1. Preferisco anche 'Directory.GetFiles' su' DirectoryInfo.GetFiles' ogni giorno, se tutto quello che voglio sono i nomi dei file. – Yogesh

+0

Mi piace perché String.Join, LINQ, no StringBuilder. –

+0

Se dai un'occhiata al codice sorgente. Il costruttore di FileInfo è molto leggero. E tutte le informazioni che vedi sono fatte attraverso le proprietà. Vengono raccolte solo quando le chiami – fjch1997

-4
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(); 

    } 

} 
+5

Sembra che tu non sia già al corrente che esiste già una classe Framework che fa questo per te . –

+3

Inoltre, se qualcuno ha chiamato i loro file "Current.XLSFiles.xls" questo causerà problemi REALI. –

1

Solo per la cronaca:

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

In questo modo non si utilizza StringBuilder ma String.Join(). Si noti inoltre che Path.GetFileNameWithoutExtension() necessita di un percorso completo (fi.FullName), non come ho visto in una delle risposte fi.Name.

3

FileInfo conosce la propria estensione, così si potrebbe semplicemente rimuovere

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

o se sei paranoico che potrebbe apparire nel mezzo o vuoi microottimizzare:

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

se il nome del file contiene directory e avete bisogno di non perdere directory:

fileName.Remove(fileName.LastIndexOf(".")) 
Problemi correlati