Подтвердить что ты не робот

Ли FileInfo.Extension возвращает последний *. * Шаблон или что-то еще?

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

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

Будет ли это возвращать ".txt.gz" или ".gz"?

Каково поведение с еще большим количеством расширений, например ".txt.gz.zip" или что-то в этом роде?

EDIT:

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

4b9b3361

Ответ 1

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

"Свойство 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;
    }
}

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

Ответ 2

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

Все проходят

Ответ 3

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

Ответ 4

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

Примечания

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

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

Было бы неплохо, что в именах файлов есть авторитетный ответ, но мне трудно найти его.