Supprimer l'extension de fichier d'une chaîne de nom de fichier


201

Si j'ai une chaîne disant "abc.txt", existe-t-il un moyen rapide d'obtenir une sous-chaîne juste "abc"?

Je ne peux pas faire un fileName.IndexOf('.')parce que le nom du fichier pourrait être "abc.123.txt"ou quelque chose et je veux évidemment juste me débarrasser de l'extension (ie "abc.123").

Réponses:


372

La Path.GetFileNameWithoutExtensionméthode vous donne le nom de fichier que vous passez comme argument sans l'extension, comme cela devrait être évident d'après le nom.


1
J'allais suggérer: string.Format ("{0} \\ {1}", Path.GetDirectoryName (path), Path.GetFileNameWithoutExtension (path)) ... mais j'ai vu une version encore meilleure ci-dessous en utilisant Path.Combine au lieu de String.Format!
emery.noel

4
La conservation du chemin n'est pas un effet souhaité, notez que le nom de la méthode est GetFileNameWithoutExtension. Si la préservation du chemin a été promise, le nom de la méthode aurait dû être différent. La description de la méthode est également assez spécifique, seul le nom de fichier sans extension est renvoyé. L'OP ne précise pas qu'il a besoin du chemin. Bien au contraire.
Morten Bork

@dukevin rien sur cette question n'a quoi que ce soit à voir avec le chemin. Il demande simplement la suppression de l'extension du nom de fichier .
Rory McCrossan

249

Il y a une méthode dans le framework à cet effet, qui gardera le chemin complet sauf pour l'extension.

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

Si seul le nom de fichier est nécessaire, utilisez

System.IO.Path.GetFileNameWithoutExtension(path);

37
Ceci est la bonne réponse. Le chemin de fichier des bandes de réponse acceptées
citron

8
C'est une meilleure réponse car elle préserve le chemin
James H

8
Le nulla une valeur magique ici. Si vous utilisez String.Emptyaka, il ""vous restera un point de fin [ .].
THBBFT

Je ne suis pas d'accord que cette réponse est meilleure. GetFileNameWithoutExtensionest plus explicite. Bien qu'il soit agréable de connaître son effet secondaire potentiellement indésirable et l'existence d'une alternative pour l'éviter.
jeromej

57

Vous pouvez utiliser

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

Et puis supprimez l'extension manuellement:

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

@Bio, en fait, cela correspond à la longueur de l'extension, puis récupère le nom de fichier jusqu'à l'extension.
Neville

Si vous décidez d'ignorer la fonctionnalité System.IO.Path n'est pas mieux si vous obtenez l'extension comme suit: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

28

String.LastIndexOf fonctionnerait.

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

10
Attention aux fichiers sans extension, comme foo/bar.cat/cheese!
Cameron

String.LastIndexOfest dangereux pour accomplir quelque chose comme ça. Pour les fichiers sans extension, comme @Cameron l'a indiqué ci-dessus, vos résultats peuvent ne pas être ce que vous voulez. La façon la plus sûre de le faire est d'utiliser la réponse de @ Logman ci-dessus.
Shiva

13

Si vous voulez créer un chemin complet sans extension, vous pouvez faire quelque chose comme ceci:

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

mais je cherche un moyen plus simple de le faire. Est-ce que quelqu'un a une idée?


8

J'ai utilisé le code ci-dessous, moins

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

La sortie sera

C: \ fichier


2
Et si mon séparateur de répertoire est '/';)?
Logman

4
Utilisez Path.Combine()plutôt que de spécifier "\\".
Broots Waymb

1

si vous souhaitez utiliser l'opération String, vous pouvez utiliser la fonction lastIndexOf () qui recherche la dernière occurrence d'un caractère ou d'une sous-chaîne. Java a de nombreuses fonctions de chaîne.


1

Vous ne demandez peut-être pas l'API UWP. Mais dans UWP, file.DisplayNamec'est le nom sans extensions. J'espère utile pour les autres.


0

Je sais que c'est une vieille question et Path.GetFileNameWithoutExtensionc'est une option meilleure et peut-être plus propre. Mais personnellement, j'ai ajouté ces deux méthodes à mon projet et je voulais les partager. Cela nécessite C # 8.0 car il utilise des plages et des indices.

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
Cela ne répond pas à la question.
Rapptz

1
Pourquoi voudriez-vous écrire une méthode d'extension pour cela? Mis à part ce cas très spécifique, String.GetFileExtension () n'a aucun sens. Cependant, la fonction est reportée partout et elle est censée dénoter un comportement spécifique à n'importe quelle chaîne. Ce qui n'est pas le cas.

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

S'il vous plaît, ne vous contentez pas de poster du code, il est beaucoup plus utile d'expliquer votre réponse à côté du code.
SuperBiasMan

1
Une grande partie du code est complètement hors de propos. L'explication est manquante. Ce n'est pas utile.
Palec

Le code est trop spécifique à un problème différent de celui en question.
Dominic Bett

-4

Cette mise en œuvre devrait fonctionner.

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

11
Et alors abc.txt.pdf? :-)
Palec
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.