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 .

tweetypi
quelle

Antworten:

371

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

R. Martinho Fernandes
quelle
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);
Ran QUAN
quelle
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);
phdesign
quelle
@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);
Andrew
quelle
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?

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

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

Shraddha
quelle
1

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

Sudoer
quelle
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);
}
Emiliano Ruiz
quelle
-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;
    }
shmaltzy
quelle
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!!!");
            }
        }
Prashant Chavan
quelle
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", "");
Dominic Bett
quelle
11
Was ist mit abc.txt.pdf? :-)
Palec