我很好奇以下行为的确切表现:
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”。"
因此,我使用 Reflector 查找了 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;
}
}
该代码从文件路径的末尾开始逐个检查每个字符,直到找到一个点,然后返回从该点到文件路径结尾的子字符串。
Extension
属性返回FileSystemInfo
扩展名,包括句点(.)。例如,对于文件c:\NewFile.txt
,此属性返回“.txt”。 - Codeman[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
属性不会尝试。
备注
通过搜索路径中的句点 (.) 来获取路径的扩展名,从路径的最后一个字符开始,向路径的开头继续搜索。如果在 DirectorySeparatorChar 或 AltDirectorySeparatorChar 字符之前找到了句点,则返回的字符串包含句点和其后的字符;否则,返回 Empty。
有关常见 I/O 任务的列表,请参阅常见 I/O 任务。
如果有一个关于文件名的权威答案,那将会很好,但我找不到它。
Path.GetExtension()
的代码,否则您如何确切地说呢?如果您已经查找过,请将其添加到您的帖子中。就目前而言,这只是您的一种假设,而您知道关于假设的那句话... - cogumel0FileSystemInfo.Extension
必须 返回与 Path.GetExtension
相同的值?我在MSDN上找不到任何证据证明这一点,如果你没有证据,那么很遗憾,你只是假设这两个行为相同。 - cogumel0Path.GetExtension
只是在后台调用FileSystemInfo.Extension
...就像您所说的,这可能随时更改,因此如果没有文档中的某些内容来显示,直到另行通知为止,这是情况,我认为您没有权利发表如此强烈的言论。简而言之,我喜欢您的回答,只是对“逻辑上必须”的部分感到冒犯,我认为“应该”更适合那里。 - cogumel0Path.GetExtension
和 FileSystemInfo.Extension
使用不同的“扩展”定义,那么这将是不合逻辑的。为了使这些方法合乎逻辑,它们必须就定义达成一致。 - user743382
info.Extension
的确切作用,这样我就可以围绕这些假设编写我的单元测试了 :) - Codeman