FileInfo.Extension是否返回最后的*。*模式或其他内容?

我很好奇以下是什么行为:

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

这会返回“.txt.gz”还是“.gz”?

更多扩展的行为是什么,例如“.txt.gz.zip”或类似的东西?

编辑:

要清楚,我已经测试了这个。 我想要一个属性的解释。

它将返回.gz,但MSDN( FileSystemInfo.Extension属性 )的解释并不清楚原因:

Extension属性返回FileSystemInfo扩展名,包括句点(。)。例如,对于文件c:\ NewFile.txt,此属性返回”.txt“。

所以我用reflection器查找了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.Extension的文档没有回答这个问题,但它在逻辑上必须返回与Path.GetExtension相同的值,文档指出:

备注

路径的扩展是通过搜索句点(。)的路径获得的,从路径中的最后一个字符开始并继续朝向路径的开始。 如果在DirectorySeparatorChar或AltDirectorySeparatorChar字符之前找到句点,则返回的字符串包含句点和后面的字符; 否则,返回Empty。

有关常见I / O任务的列表,请参阅常见I / O任务。

对文件名一般有一个权威的答案会很好,但我找不到它。