Entfernen Sie die Dateierweiterung aus einer Dateinamenzeichenfolge


201

Wenn ich einen String habe "abc.txt", der sagt , gibt es eine schnelle Möglichkeit, einen Teilstring zu erhalten, der gerecht ist "abc"?

Ich kann keine machen, fileName.IndexOf('.')weil der Dateiname sein könnte "abc.123.txt"oder so und ich möchte natürlich nur die Erweiterung (dh "abc.123") loswerden .

Antworten:


371

Die Path.GetFileNameWithoutExtensionMethode gibt Ihnen den Dateinamen, den Sie als Argument ohne die Erweiterung übergeben, wie aus dem Namen ersichtlich sein sollte.


1
Wollte vorschlagen: string.Format ("{0} \\ {1}", Path.GetDirectoryName (Pfad), Path.GetFileNameWithoutExtension (Pfad)) ... aber ich habe unten eine noch bessere Version mit Path.Combine anstelle von gesehen String.Format!
emery.noel

4
Das Beibehalten des Pfads ist kein gewünschter Effekt. Beachten Sie, dass der Methodenname GetFileNameWithoutExtension lautet. Wenn die Pfaderhaltung versprochen wurde, sollte der Methodenname anders sein. Die Methodenbeschreibung ist ebenfalls sehr spezifisch, nur der Dateiname ohne Erweiterung wird zurückgegeben. Das OP gibt nicht an, dass er den Pfad benötigt. Ganz im Gegenteil.
Morten Bork

@dukevin nichts über diese Frage hat etwas mit dem Pfad zu tun. Es wird lediglich die Entfernung der Erweiterung aus dem Dateinamen angefordert .
Rory McCrossan

248

Zu diesem Zweck gibt es im Framework eine Methode, die den vollständigen Pfad bis auf die Erweiterung beibehält.

System.IO.Path.ChangeExtension(path, null);

Wenn nur der Dateiname benötigt wird, verwenden Sie

System.IO.Path.GetFileNameWithoutExtension(path);

37
Dies ist die richtige Antwort. Die akzeptierte Antwort streift Dateipfad
Zitrone

8
Dies ist eine bessere Antwort, da es den Weg bewahrt
James H

8
Das nullhat hier einen magischen Wert. Wenn Sie String.Emptyaka verwenden "", bleibt ein nachfolgender [ .] Punkt übrig .
THBBFT

Ich bin nicht der Meinung, dass diese Antwort besser ist. GetFileNameWithoutExtensionist expliziter. Obwohl es schön ist, über seine möglicherweise unerwünschten Nebenwirkungen und die Existenz einer Alternative zu Bescheid zu wissen.
Jeromej

57

Sie können verwenden

string extension = System.IO.Path.GetExtension(filename);

Und dann entfernen Sie die Erweiterung manuell:

string result = filename.Substring(0, filename.Length - extension.Length);

@Bio, eigentlich ist das die Länge der Erweiterung, und dann greift der Dateiname bis zur Erweiterung.
Neville

Wenn Sie System.IO.Path ignorieren möchten, ist die Funktionalität nicht besser, wenn Sie die Erweiterung wie folgt erhalten: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

27

String.LastIndexOf würde funktionieren.

string fileName= "abc.123.txt";
int fileExtPos = fileName.LastIndexOf(".");
if (fileExtPos >= 0 )
 fileName= fileName.Substring(0, fileExtPos);

10
Achten Sie auf Dateien ohne Erweiterung, wie foo/bar.cat/cheese!
Cameron

String.LastIndexOfist gefährlich, um so etwas zu erreichen. Bei Dateien ohne Erweiterung, wie oben von @Cameron angegeben, entsprechen Ihre Ergebnisse möglicherweise nicht Ihren Wünschen. Der sicherste Weg, dies zu tun, ist die Verwendung der obigen Antwort
Shiva

13

Wenn Sie einen vollständigen Pfad ohne Erweiterung erstellen möchten, können Sie Folgendes tun:

Path.Combine( Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath))

aber ich suche nach einem einfacheren Weg, das zu tun. Hat jemand eine Idee?


8

Ich habe den folgenden, weniger Code verwendet

string fileName = "C:\file.docx";
MessageBox.Show(Path.Combine(Path.GetDirectoryName(fileName),Path.GetFileNameWithoutExtension(fileName)));

Ausgabe wird sein

C: \ Datei


2
Und was ist, wenn mein Verzeichnistrennzeichen '/' ist;)?
Logman

4
Verwenden Sie Path.Combine()anstatt zu spezifizieren "\\".
Broots Waymb

1

Wenn Sie die String-Operation verwenden möchten, können Sie die Funktion lastIndexOf () verwenden, die nach dem letzten Vorkommen eines Zeichens oder einer Teilzeichenfolge sucht. Java hat zahlreiche String-Funktionen.


1

Sie fragen vielleicht nicht die UWP-API. Aber in UWP file.DisplayNameist der Name ohne Erweiterungen. Hoffe nützlich für andere.


1

Ich weiß, dass es eine alte Frage ist und Path.GetFileNameWithoutExtensioneine bessere und vielleicht sauberere Option ist. Aber ich persönlich habe diese beiden Methoden zu meinem Projekt hinzugefügt und wollte sie teilen. Dies erfordert C # 8.0, da Bereiche und Indizes verwendet werden.

public static string RemoveExtension(this string file) => ReplaceExtension(file, null);

public static string ReplaceExtension(this string file, string extension)
{
    var split = file.Split('.');

    if (string.IsNullOrEmpty(extension))
        return string.Join(".", split[..^1]);

    split[^1] = extension;

    return string.Join(".", split);
}

-1
    /// <summary>
    /// Get the extension from the given filename
    /// </summary>
    /// <param name="fileName">the given filename ie:abc.123.txt</param>
    /// <returns>the extension ie:txt</returns>
    public static string GetFileExtension(this string fileName)
    {
        string ext = string.Empty;
        int fileExtPos = fileName.LastIndexOf(".", StringComparison.Ordinal);
        if (fileExtPos >= 0)
            ext = fileName.Substring(fileExtPos, fileName.Length - fileExtPos);

        return ext;
    }

2
Dies beantwortet die Frage nicht.
Rapptz

1
Warum würden Sie dafür eine Erweiterungsmethode schreiben? Abgesehen von diesem sehr speziellen Fall macht String.GetFileExtension () überhaupt keinen Sinn. Die Funktion wird jedoch überall übertragen und soll das Verhalten eines beliebigen Strings bezeichnen. Welches ist nicht der Fall.

-3
        private void btnfilebrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            //dlg.ShowDialog();
            dlg.Filter = "CSV files (*.csv)|*.csv|XML files (*.xml)|*.xml";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string fileName;
                fileName = dlg.FileName;
                string filecopy;
                filecopy = dlg.FileName;
                filecopy = Path.GetFileName(filecopy);
                string strFilename;
                strFilename = filecopy;
                 strFilename = strFilename.Substring(0, strFilename.LastIndexOf('.'));
                //fileName = Path.GetFileName(fileName);             

                txtfilepath.Text = strFilename;

                string filedest = System.IO.Path.GetFullPath(".\\Excels_Read\\'"+txtfilepath.Text+"'.csv");
               // filedest = "C:\\Users\\adm\\Documents\\Visual Studio 2010\\Projects\\ConvertFile\\ConvertFile\\Excels_Read";
                FileInfo file = new FileInfo(fileName);
                file.CopyTo(filedest);
             // File.Copy(fileName, filedest,true);
                MessageBox.Show("Import Done!!!");
            }
        }

Bitte geben Sie nicht nur die Postleitzahl ein, es ist auch viel hilfreicher, Ihre Antwort neben dem Code zu erklären.
SuperBiasedMan

1
Ein großer Teil des Codes ist völlig irrelevant. Erklärung fehlt. Das ist nicht sinnvoll.
Palec

Der Code ist zu spezifisch für ein anderes Problem als das betreffende.
Dominic Bett

-4

Diese Implementierung sollte funktionieren.

string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");

11
Was ist mit abc.txt.pdf? :-)
Palec
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.