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

Cod*_*man 26 c# string file-extension fileinfo

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

FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;
Run Code Online (Sandbox Code Playgroud)

这会返回".txt.gz"还是".gz"?

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

编辑:

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

Erw*_*win 44

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

" 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它检查文件路径末尾的每个字符,直到找到一个点,然后从字符串返回到文件路径末尾的子字符串.

  • 很好,这正是我想要的,谢谢! (3认同)
  • 扩展可能是“multiDotted”,就像在 SaveFileDialog 中一样。 (3认同)

Joh*_*son 9

[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);
}
Run Code Online (Sandbox Code Playgroud)

全部通过


Tho*_*que 7

它返回最后一个点的扩展名,因为它无法猜测文件名的另一部分是否是扩展名的一部分.在这种情况下testfile.txt.gz,你可以说扩展是.txt.gz,但是怎么样System.Data.dll?扩展名应该是.Data.dll吗?可能不是......没有办法猜测,所以Extension财产不会尝试.