Dateinamen ohne Erweiterungen abrufen


279

Beim Abrufen von Dateinamen in einem bestimmten Ordner:

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

fi.Namegibt mir einen Dateinamen mit der Erweiterung: file1.txt, file2.txt, file3.txt.

Wie kann ich die Dateinamen ohne die Erweiterungen erhalten? ( file1, file2, file3)

Antworten:


479

Sie können verwenden Path.GetFileNameWithoutExtension:

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

Obwohl ich überrascht bin, gibt es keine Möglichkeit, dies direkt von der zu bekommen FileInfo(oder zumindest kann ich es nicht sehen).


7
Und um die Erweiterung zu erhalten (um sie später hinzuzufügen), verwenden Sie: Path.GetExtension (fileName);
Justin

2
@Juzzz Das ist praktisch, wenn Sie mit einer bloßen Zeichenfolge arbeiten, aber wenn Sie bereits ein FileInfo-Objekt haben, müssen Sie sich nicht um Path kümmern. FileInfo stellt zu diesem Zweck bereits die Eigenschaft "Erweiterung" bereit.
jmbpiano

Ich habe den Fehler "'Builder' existiert im aktuellen Kontext nicht" erhalten. Ich habe 'system.Text' hinzugefügt, aber immer noch den gleichen Fehler erhalten. Was ist der Grund?
fünfzig

@ffttyy builderwird eine Instanz StringBuilderim OP-Code sein. Dies ist nur ein Beispiel für die Verwendung von GetFileNameWithoutExtension. Sie sollten wahrscheinlich Ihren eigenen Code schreiben, der ihn aufruft.
Rup

9
Hier ist zu beachten, dass, wenn Ihre Datei eine doppelte Erweiterung enthält, GetFileNameWithoutExtensionnur die End- Erweiterung entfernt wird. Zum Beispiel kann der Dateiname example.es6.jswird wordenexample.es6
David Robert

48

Beachten Sie, dass Path.GetFileNameWithoutExtension nicht der beste Weg ist, da es nach ungültigen Pfadzeichen sucht und versucht, DirectorySeparatorChar, AltDirectorySeparatorChar oder VolumeSeparatorChar in einer Schleife zu extrahieren, die für Dateinamen (nicht vollständige Pfade) nicht erforderlich zu sein scheint!
Serpooshan

22

Diese Lösung verhindert auch das Hinzufügen eines nachgestellten Kommas.

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

Ich mag die DirectoryInfo, FileInfo für dieses Szenario nicht.

DirectoryInfo und FileInfo erfassen mehr Daten über den Ordner und die Dateien als erforderlich, sodass sie mehr Zeit und Speicher als erforderlich benötigen.


2
+1. Ich bevorzuge Directory.GetFilesauch DirectoryInfo.GetFilesjeden Tag, wenn ich nur Dateinamen möchte.
Yogesh

Ich mag das, weil String.Join, LINQ, kein StringBuilder.
Csaba Toth

Wenn Sie sich den Quellcode ansehen. Der Konstruktor von FileInfo ist sehr leicht. Alle Informationen, die Sie sehen, werden über Eigenschaften erstellt. Sie werden nur gesammelt, wenn Sie sie anrufen
fjch1997

@ fjch1997 - Der Konstruktor ruft Path.GetFileName auf und überprüft die Berechtigungen. Das scheint also ein bisschen überflüssig zu sein.
Erno

@ErnodeWeerd FileIOPermission überprüft die Berechtigung nicht für die ACL. Stattdessen ist es eine Art Mechanismus in .NET, die Berechtigung für teilweise vertrauenswürdigen Code zu überprüfen. Es sollte also keinen tatsächlichen E / A-Aufruf geben. Wie stark wirkt es sich auf die Leistung aus? Ich kann nicht sagen, ohne zu testen. Aber ich nehme an, es ist nicht so toll
fjch1997

10

Verwenden Sie Path.GetFileNameWithoutExtension. Der Pfad befindet sich im System.IO-Namespace.



6

Als zusätzliche Antwort (oder als Ergänzung zu den vorhandenen Antworten) können Sie eine Erweiterungsmethode schreiben, um dies für Sie in der DirectoryInfo-Klasse zu erreichen. Hier ist ein Beispiel, das ich ziemlich schnell geschrieben habe und das verschönert werden könnte, um Verzeichnisnamen oder andere Kriterien für Änderungen usw. bereitzustellen:

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

Bearbeiten: Ich denke auch, dass diese Methode wahrscheinlich vereinfacht oder großartig sein könnte, wenn sie LINQ verwendet, um den Aufbau des Arrays zu erreichen, aber ich habe nicht die Erfahrung in LINQ, um dies für ein Beispiel dieser Art schnell genug zu tun.

Edit 2 (fast 4 Jahre später): Hier ist die LINQ-ified-Methode, die ich verwenden würde:

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

5

FileInfo kennt seine eigene Erweiterung, so dass Sie es einfach entfernen können

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

oder wenn Sie paranoid sind, dass es in der Mitte erscheinen könnte oder mikrooptimieren möchten:

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

4

Wenn der Dateiname das Verzeichnis enthält und Sie das Verzeichnis nicht verlieren müssen:

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

2

Versuche dies,

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];

1

Nur für das Protokoll:

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

So kann man nicht verwenden , StringBuilderaber String.Join(). Bitte beachten Sie auch, dass Path.GetFileNameWithoutExtension()ein vollständiger Pfad ( fi.FullName) erforderlich ist , nicht fi.Namewie ich in einer der anderen Antworten gesehen habe.


-5
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
Sie scheinen nicht zu wissen, dass es bereits eine Framework-Klasse gibt, die dies für Sie erledigt.
Andrew Barber

3
Wenn jemand seine Dateien "Current.XLSFiles.xls" nennt, führt dies zu REAL-Problemen.
Tom Padilla

@ TomPadilla warum sollte dies Probleme verursachen?
Luke101

Weil diese Methode "Current.files" als Dateinamen anzeigen würde. Weil jede Instanz von ".xls" durch "" ersetzt würde, einschließlich solcher in der Mitte des Namens.
Tom Padilla
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.