Does FileInfo.Extension return the last *.* pattern, or something else?

Codeman picture Codeman · Oct 2, 2012 · Viewed 25.5k times · Source

I'm curious what exactly the behavior is on the following:

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

Will this return ".txt.gz" or ".gz"?

What is the behavior with even more extensions, such as ".txt.gz.zip" or something like that?

EDIT:

To be clear, I've already tested this. I would like an explanation of the property.

Answer

Erwin picture Erwin · Oct 2, 2012

It will return .gz, but the explanation from MSDN (FileSystemInfo.Extension Property) isn't clear why:

"The Extension property returns the FileSystemInfo extension, including the period (.). For example, for a file c:\NewFile.txt, this property returns ".txt"."

So I looked up the code of the Extension property with reflector:

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

It's check every char from the end of the filepath till it finds a dot, then a substring is returned from the dot to the end of the filepath.