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)

rem
quelle

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).

Rup
quelle
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

Verwenden Sie Path.GetFileNameWithoutExtension().

Marcel Gheorghita
quelle
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.

Erno
quelle
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.

Pradeep
quelle
10
Path.GetFileNameWithoutExtension(file);

Dies gibt den Dateinamen nur ohne den Erweiterungstyp zurück. Sie können es auch ändern, sodass Sie sowohl den Namen als auch den Dateityp erhalten

 Path.GetFileName(FileName);

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

Chong Ching
quelle
Danke, die beste Antwort ist immer die kürzeste Antwort.
Ashraf Abusada
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));
    }
}
Joel Etherton
quelle
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)
drzaus
quelle
4

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

fileName.Remove(fileName.LastIndexOf("."))
Omid-RH
quelle
2

Versuche dies,

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];
Ali CAKIL
quelle
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.

Papuashu
quelle
-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();

    }

}
Tisho
quelle
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