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

tweetypi
la source

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.

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

Logman
la source
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

Benjym
la source
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.

Shraddha
la source
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.

sudoer
la source
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);
}
Emiliano Ruiz
la source
-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
la source
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!!!");
            }
        }
Prashant Chavan
la source
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", "");
Dominic Bett
la source
11
Et alors abc.txt.pdf? :-)
Palec