文件扩展名中是否可以存在空格?

Nic*_*win 10 .net c# filesystems file

我目前正在处理一些涉及将文件保存到用户定义文件的代码.如果用户传入没有扩展名的文件名,则代码会根据文件类型(内部存储)自动检测扩展名.

但是,我很难确定传递给代码的文件名是否有扩展名.我正在使用Path.HasExtension(filename),Path.GetExtension(filename)但似乎表现出奇怪的行为:

File.EXT=> .EXT是扩展名.这可以.

This Is A File.EXT=> .EXT是扩展名.这也没关系.

This Is A File. Not An Extension=> . Not An Extension是扩展名.但是,我认为这是一个没有扩展名的文件.当我创建一个具有此名称的文件时,Windows也会这样想(创建一个带有无法识别的扩展名的文件会导致窗口将其称为a EXTENSIONNAME File,而没有像这样的扩展名的文件只会被调用File).

This Is A File.Not An Extension=> .Not An Extension是扩展名.与上述问题相同.

还要注意,同样的行为是显而易见的Path.GetFileNameWithoutExtension(filename)(例如,它报告的文件名没有扩展名,最后两个例子只是This Is A File).

所以我从中得到的是.NET和Windows在他们认为的扩展方面有所不同.


问题: 我想知道我是否可以实现这样的代码:

if(!Path.HasExtension(filename) || Path.GetExtension(filename).Contains(" ")) {...}

因为这会使我的代码定义适当的扩展更符合Windows处理事物的方式.或者有什么我在这里遗漏的明确说明我必须在我的扩展中允许空格?

我搜索并发现了这个稍微类似的问题,但是其中链接的文档仅指出不建议以空格/句点结束扩展 - 他们对扩展中的空格没有任何说明.

Gab*_*abe 11

Windows中文件名的扩展名纯粹是一种约定.该GetExtensionHasExtension方法仅查找文件名中的一个点,并采取相应的行动.您可以随意在文件名(包括扩展名)中的任何位置放置空格.

当你说"Windows也这么认为"时,它实际上只是资源管理器中的一些代码试图解析扩展,它只是使用与.NET略有不同的算法.


Jon*_*Jon 6

文件系统如何处理名称和 Windows shell(即资源管理器)如何处理文件名是两种完全不同的野兽。

文件系统不关心空格、点或其他任何东西——对它来说,文件名只是一个不透明的字符串(对允许的字符有一些限制)。名称/扩展名分离只是一个虚构的约定。另一方面,shell 可以自由地解释扩展名是什么,因为它的目的不是存储和检索文件信息,而是为用户提供更好的体验。所以不要去那里寻找答案。

我建议使用System.IO方法返回的内容(因为遵循约定是好的),但是如果有充分的理由,您可以在代码中做任何您喜欢的事情。


orl*_*rlp 5

没有关于扩展是什么的官方定义。常见的约定是 final 之后的一切.都是扩展。

但是,如果您要获取所有常用扩展的大量列表,我认为您只会找到少数使用扩展中空格的示例。

我会说,禁止在扩展中使用空格。999/1000 次用户并不意味着它是一个扩展。

在文件名上引用维基百科

. (DOT):允许,但最后一次出现将被解释为 VMS、MS-DOS 和 Windows 中的扩展分隔符。在其他操作系统中,通常被视为文件名的一部分,并且可能允许不止一个句号。