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

C# 文件扩展名中是否可以存在空格?,c#,.net,windows,file,filesystems,C#,.net,Windows,File,Filesystems,我目前正在处理一些涉及将文件保存到用户定义文件的代码。如果用户传入的文件名没有扩展名,则代码会根据文件类型(存储在内部)自动检测扩展名 但是,我很难确定传递给代码的文件名是否有扩展名。我正在使用Path.HasExtension(文件名)和Path.GetExtension(文件名),但它似乎表现出奇怪的行为: File.EXT=>.EXT是扩展名。这很好 这是一个文件。EXT=>。EXT是扩展名。这也很好 这是一个文件。不是扩展名=>。不是扩展名是扩展名。但是,我认为这是一个没有扩展名的文件。

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

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

File.EXT
=>
.EXT
是扩展名。这很好

这是一个文件。EXT
=>
。EXT
是扩展名。这也很好

这是一个文件。不是扩展名
=>
。不是扩展名
是扩展名。但是,我认为这是一个没有扩展名的文件。当我创建一个具有此名称的文件时,Windows也这么认为(创建一个扩展名无法识别的文件会导致Windows将其称为
EXTENSIONNAME文件
,而没有扩展名的文件(如此文件)只称为
文件

这是一个文件。不是扩展名
=>
。不是扩展名
是扩展名。与上述问题相同

还要注意,同样的行为在
Path.GetFileNameWithoutExtension(filename)
中也很明显(例如,在最后两个示例中,它报告的文件名没有扩展名,只是
这是一个文件

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


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

if(!Path.HasExtension(filename)| | Path.GetExtension(filename).Contains(“”){…}

因为这将使我的代码对适当扩展的定义更符合Windows的处理方式。或者是我在这里遗漏了什么,明确地说我必须在扩展中允许空格


我已经搜索并找到了,但是其中链接的文档只指定不建议以空格/句点结束扩展--它们没有提到扩展中的空格。

没有关于扩展的正式定义。常见的惯例是,最后一个
之后的所有内容都是扩展

然而,如果你想获得一个所有常用扩展的巨大列表,我想你只会找到少数几个例子,其中使用了扩展中的空格

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

引述:

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


Windows中文件名的扩展名纯粹是一种约定。
GetExtension
hasdextension
方法只在文件名中查找一个点并相应地执行操作。您可以在文件名(包括扩展名)中任意放置空格


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

文件系统如何处理名称和Windows shell(即资源管理器)如何处理文件名是两个完全不同的问题


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


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

我可以创建一个文件
这是一个文件。不是同时使用Windows 7和Windows XP的扩展
。I
右键单击桌面,新建文本文档
,创建文件。或者你说的是使用.Net创建文件?@Thomas我可以使用.Net或Windows 7创建这些文件。我的观点是,Windows不承认“.Not a Extension”为文件的扩展名,而.NET则承认。您关于“Windows所想”的任何说法都没有任何证据或示例支持。.NET函数遵循标准实践--路径最后一段中最后一个
后面的字符是扩展名。如果
后面出现空格,则执行不同的操作是多余的工作,没有充分的理由。此外,对于您的用例,不需要进行区分——如果文件名已经具有适合于内容类型的扩展名,则不执行任何操作,否则请附加适当的扩展名。。。这比替换现有的扩展要好,而现有的扩展可能不是一个。。。无论你做什么都可以,只要你记录下来,这样你的用户就知道他们的输入将如何处理。好的,谢谢你的回答。从一个人的角度来看,如果用户认为它是一个扩展,如果它有一个空间,你认为它是合理的吗?你可以很容易地想象没有人会创建一个程序,其中使用扩展的空间,所以扩展中的任何空间都意味着它不是一个扩展。谢谢你回答我的两个问题:“文件系统不关心空格和点”-这实际上不是真的…创建一些以点或空格结尾的文件(例如,你可以用cygwin来做),然后看看系统如何处理它们。(最好在你不关心的FS上做这件事。)这是一个人工操作