web-dev-qa-db-fra.com

FileInfo.Extension renvoie-t-il le dernier modèle *. * Ou autre chose?

Je suis curieux de savoir exactement quel est le comportement sur les points suivants:

FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;

Est-ce que cela retournera ".txt.gz" ou ".gz"?

Quel est le comportement avec encore plus d'extensions, comme ".txt.gz.Zip" ou quelque chose comme ça?

ÉDITER:

Pour être clair, je l'ai déjà testé. Je voudrais une explication de la propriété.

26
Codeman

Il renverra .gz, mais l'explication de MSDN ( propriété FileSystemInfo.Extension ) n'est pas claire pourquoi:

" La propriété Extension renvoie l'extension FileSystemInfo, y compris le point (.). Par exemple, pour un fichier c:\NewFile.txt, cette propriété renvoie" .txt ". "

J'ai donc recherché le code de la propriété Extension avec réflecteur:

public string Extension
{
    get
    {
        int length = this.FullPath.Length;
        int startIndex = length;
        while (--startIndex >= 0)
        {
            char ch = this.FullPath[startIndex];
            if (ch == '.')
            {
                return this.FullPath.Substring(startIndex, length - startIndex);
            }
            if (((ch == Path.DirectorySeparatorChar) || (ch == Path.AltDirectorySeparatorChar)) || (ch == Path.VolumeSeparatorChar))
            {
                break;
            }
        }
        return string.Empty;
    }
}

Il vérifie chaque caractère de la fin du chemin de fichier jusqu'à ce qu'il trouve un point, puis une sous-chaîne est renvoyée du point jusqu'à la fin du chemin de fichier.

44
Erwin
[TestCase(@"C:/testfile.txt.gz", ".gz")]
[TestCase(@"C:/testfile.txt.gz.Zip", ".Zip")]
[TestCase(@"C:/testfile.txt.gz.SO.jpg", ".jpg")]
public void TestName(string fileName, string expected)
{
    FileInfo info = new FileInfo(fileName);
    string actual = info.Extension;
    Assert.AreEqual(actual, expected);
}

Tous passent

9
Johan Larsson

Il renvoie l'extension à partir du dernier point, car il ne peut pas deviner si une autre partie du nom de fichier fait partie de l'extension. Dans le cas de testfile.txt.gz, vous pourriez faire valoir que l'extension est .txt.gz, mais qu'en est-il de System.Data.dll? Si l'extension est .Data.dll? Probablement pas ... Il n'y a aucun moyen de deviner, donc la propriété Extension n'essaye pas.

7
Thomas Levesque

L'extension de fichier commence au dernier point. Malheureusement, la documentation de FileSystemInfo.Extension ne répond pas à cela, mais elle doit logiquement renvoyer la même valeur que Path.GetExtension , pour laquelle la documentation indique:

Remarques

L'extension de chemin est obtenue en recherchant chemin pendant un point (.), En commençant par le dernier caractère du chemin et en continuant vers le début du chemin. Si un point est trouvé avant un caractère DirectorySeparatorChar ou AltDirectorySeparatorChar, la chaîne renvoyée contient le point et les caractères après celui-ci; sinon, Empty est retourné.

Pour obtenir la liste des tâches d'E/S courantes, voir Tâches d'E/S courantes.

Ce serait bien qu'il y ait une réponse faisant autorité sur les noms de fichiers en général, mais j'ai du mal à la trouver.

2
user743382