Делает FileInfo.Расширение возвращает последнее *.* паттерн или что-то еще?


Мне любопытно, как именно поведет себя следующее:

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

Вернется ли это".формат txt.gz "или".ГЗ"?

Что такое поведение с еще большими расширениями, такими как ".формат txt.gz.зип" или что-то в этом роде?

Правка:

Чтобы быть ясным, я уже проверил это. Я хотел бы получить объяснения по поводу собственности.
4 24

4 ответа:

Он вернется .gz, но объяснение от MSDN (FileSystemInfo.Свойство расширения ) непонятно, почему:

"свойство Extension возвращает расширение FileSystemInfo, включая точку (.). Например, для файла c:\NewFile.txt, это свойство возвращает".формат txt". "

Поэтому я искал код свойства Extension с отражателем:

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;
    }
}

Он проверяет каждый символ с конца пути к файлу, пока не найдет точку, затем возвращается подстрока из точка в конце пути к файлу.

[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);
}

Все проходят

Он возвращает расширение из последней точки, потому что не может угадать, является ли другая часть имени файла частью расширения. В случае testfile.txt.gz можно утверждать, что расширение .txt.gz, но как насчет System.Data.dll? Должно ли расширение быть .Data.dll? Скорее всего, нет... Нет никакого способа угадать, поэтому СВОЙСТВО Extension не пытается.

Расширение файла начинается с последней точки. К сожалению, документация для FileSystemInfo.Расширение не отвечает на этот вопрос, но оно логически должно возвращать то же значение, что и Путь .GetExtension , для которого в документации указано:

Примечания

Расширение пути получается путем поиска пути за период (.), начиная с последнего символа в пути и продолжая к началу пути. Если период находится перед DirectorySeparatorChar или AltDirectorySeparatorChar символ, возвращаемая строка содержит точку и символы после нее; в противном случае возвращается пустой.

Список общих задач ввода-вывода см. В разделе Общие задачи ввода-вывода.

Было бы неплохо, если бы существовал авторитетный ответ на имена файлов в целом, но у меня возникли проблемы с его поиском.