web-dev-qa-db-ja.com

FileInfo.Extensionは最後の*。*パターン、または何か他のものを返しますか?

私は以下の動作が正確に何であるか知りたいです:

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

これは「.txt.gz」または「.gz」を返しますか?

「.txt.gz.Zip」などの拡張子を追加した場合の動作は何ですか?

編集:

明確にするために、私はすでにこれをテストしました。物件の説明をお願いします。

26
Codeman

それは.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;
    }
}

ドットが見つかるまでファイルパスの最後からすべての文字をチェックし、ドットからファイルパスの最後まで部分文字列を返します。

44
Erwin
[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);
}

オールパス

9
Johan Larsson

ファイル名の別の部分が拡張子の一部であるかどうかを推測できないため、最後のドットから拡張子を返します。の場合 testfile.txt.gz、拡張子は.txt.gz、しかしSystem.Data.dll?拡張子は.Data.dll?おそらくそうではありません...推測する方法がないため、Extensionプロパティは試行しません。

7
Thomas Levesque

ファイル拡張子は最後のドットから始まります。残念ながら、 FileSystemInfo.Extension のドキュメントはその答えにはなりませんが、論理的には Path.GetExtension と同じ値を返す必要があります。

備考

パスの拡張子は、パスをピリオド(。)で検索することにより取得されます。パスの最後の文字から始まり、パスの先頭に向かって続きます。 DirectorySeparatorCharまたはAltDirectorySeparatorChar文字の前にピリオドが見つかった場合、返される文字列にはピリオドとその後の文字が含まれます。それ以外の場合は、Emptyが返されます。

一般的なI/Oタスクの一覧については、「一般的なI/Oタスク」を参照してください。

一般的にファイル名に信頼できる回答があるのはいいでしょうが、私はそれを見つけるのに苦労しています。

2
user743382