我很好奇以下行为到底是什么:
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 中的最后一个字符开始,一直到 path 的开头。如果在 DirectorySeparatorChar 或 AltDirectorySeparatorChar 字符之前找到句点,则返回的字符串包含句点及其后面的字符;否则,返回 Empty。
有关常见 I/O 任务的列表,请参阅常见 I/O 任务。
一般来说,有一个关于文件名的权威答案会很好,但我很难找到它。