Ли FileInfo.Extension возвращает последний *. * Шаблон или что-то еще?
Мне любопытно, в чем именно заключается поведение:
FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;
Будет ли это возвращать ".txt.gz" или ".gz"?
Каково поведение с еще большим количеством расширений, например ".txt.gz.zip" или что-то в этом роде?
EDIT:
Чтобы быть ясным, я уже проверил это. Я хотел бы объяснить это свойство.
Ответы
Ответ 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.
Список общих задач ввода-вывода см. в разделе Общие задачи ввода-вывода.
Было бы неплохо, что в именах файлов есть авторитетный ответ, но мне трудно найти его.