Rimuovere l'estensione del file da una stringa del nome file


201

Se ho una stringa che dice "abc.txt", c'è un modo rapido per ottenere una sottostringa che sia giusta"abc" ?

Non posso farlo fileName.IndexOf('.')perché il nome del file potrebbe essere "abc.123.txt"o qualcosa del genere e ovviamente voglio solo sbarazzarmi dell'estensione (cioè "abc.123").

Risposte:


372

Il Path.GetFileNameWithoutExtensionmetodo ti dà il nome del file che passi come argomento senza l'estensione, come dovrebbe essere ovvio dal nome.


1
Stavo per suggerire: string.Format ("{0} \\ {1}", Path.GetDirectoryName (path), Path.GetFileNameWithoutExtension (path)) ... ma ho visto una versione ancora migliore sotto l'utilizzo di Path.Combine invece di String.Format!
emery.noel,

4
Preservare il percorso non è l'effetto desiderato, notare che il nome del metodo è GetFileNameWithoutExtension. Se è stata promessa la conservazione del percorso, il nome del metodo avrebbe dovuto essere diverso. Anche la descrizione del metodo è abbastanza specifica, viene restituito solo il nome file senza estensione. L'OP non specifica che richiede il percorso. Al contrario.
Morten Bork,

@dukevin nulla di questa domanda ha a che fare con il percorso. Richiede semplicemente la rimozione dell'estensione dal nome file .
Rory McCrossan,

248

C'è un metodo nel framework per questo scopo, che manterrà il percorso completo tranne l'estensione.

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

Se è necessario solo il nome del file, utilizzare

System.IO.Path.GetFileNameWithoutExtension(path);

37
Questa è la risposta corretta La risposta accettata rimuove il percorso del file
lemon

8
Questa è una risposta migliore in quanto preserva il percorso
James H

8
Qui nullha un valore magico. Se usi String.Emptyaka, ""ti verrà lasciato un punto finale [ .].
THBBFT

Non sono d'accordo che questa risposta sia migliore. GetFileNameWithoutExtensionè più esplicito. Anche se è bello sapere del suo effetto collaterale potenzialmente indesiderato e l'esistenza di un'alternativa per evitarlo.
Jeromej,

57

Puoi usare

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

E quindi rimuovere l'estensione manualmente:

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

@Bio, in realtà quella è la lunghezza dell'estensione, quindi prende il nome del file fino all'estensione.
Neville,

Se si decide di ignorare la funzionalità System.IO.Path non è migliore se si ottiene l'estensione come: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster,

28

String.LastIndexOf funzionerebbe.

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

10
Fai attenzione ai file senza estensione, come foo/bar.cat/cheese!
Cameron,

String.LastIndexOfè pericoloso per realizzare qualcosa del genere. Per i file senza estensione, come sopra indicato da @Cameron, i risultati potrebbero non essere quelli desiderati. Il modo più sicuro per farlo è usare la risposta di @ Logman sopra.
Shiva,

13

Se vuoi creare un percorso completo senza estensione, puoi fare qualcosa del genere:

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

ma sto cercando un modo più semplice per farlo. Qualcuno ha qualche idea?


8

Ho usato il codice seguente, meno codice

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

L'output sarà

\ File: C


2
E se il mio separatore di directory fosse '/';)?
Logman,

4
Utilizzare Path.Combine()anziché specificare "\\".
Broots Waymb il

1

se si desidera utilizzare l'operazione String, è possibile utilizzare la funzione lastIndexOf () che cerca l'ultima occorrenza di un carattere o di una sottostringa. Java ha numerose funzioni di stringa.


1

Forse non stai chiedendo l'API UWP. Ma in UWP, file.DisplayNameè il nome senza estensioni. Spero utile per gli altri.


0

So che è una vecchia domanda ed Path.GetFileNameWithoutExtensionè un'opzione migliore e forse più pulita. Ma personalmente ho aggiunto questi due metodi al mio progetto e volevo condividerli. Ciò richiede C # 8.0 grazie all'uso di intervalli e indici.

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
Questo non risponde alla domanda.
Rapptz,

1
Perché dovresti scrivere un metodo di estensione per questo? A parte questo caso molto specifico, String.GetFileExtension () non ha alcun senso. Tuttavia, la funzione viene trasferita ovunque e si suppone che denoti un comportamento specifico di qualsiasi stringa. Non è così.

-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!!!");
            }
        }

Per favore, non solo pubblicare codice, è molto più utile spiegare la tua risposta insieme al codice.
SuperBiasedMan,

1
Gran parte del codice è completamente irrilevante. Spiegazione mancante. Questo non è utile
Palec,

Il codice è troppo specifico per un problema diverso da quello in questione.
Dominic Bett,

-4

Questa implementazione dovrebbe funzionare.

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

11
Che dire abc.txt.pdf? :-)
Palec,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.