次の動作が正確に何であるか知りたいです。
FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;
これは「.txt.gz」または「.gz」を返しますか?
「.txt.gz.zip」などのさらに多くの拡張子を使用した場合の動作はどうなりますか?
編集:
明確にするために、私はすでにこれをテストしました。物件の説明をお願いします。
次の動作が正確に何であるか知りたいです。
FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;
これは「.txt.gz」または「.gz」を返しますか?
「.txt.gz.zip」などのさらに多くの拡張子を使用した場合の動作はどうなりますか?
編集:
明確にするために、私はすでにこれをテストしました。物件の説明をお願いします。
.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;
}
}
ファイルパスの末尾からドットが見つかるまですべての文字をチェックし、ドットからファイルパスの末尾までの部分文字列を返します。
[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と同じ値を論理的に返す必要があります。
備考
path の拡張子は、path の最後の文字から始まり、path の先頭に向かってピリオド (.) のパスを検索することによって取得されます。DirectorySeparatorChar または AltDirectorySeparatorChar 文字の前にピリオドが見つかった場合、返される文字列にはピリオドとその後の文字が含まれます。それ以外の場合は、Empty が返されます。
一般的な I/O タスクのリストについては、一般的な I/O タスクを参照してください。
一般的にファイル名に関する信頼できる回答があるといいのですが、見つけるのに苦労しています。