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