C# · 12月 30, 2021

c# – 可以在文件扩展名中存在空格?

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

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

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

这是一个File.EXT => .EXT是扩展名.这也很好.

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

这是一个File.Not An Extension =>不扩展是扩展名.与上述相同的问题

另请注意,在Path.GetFileNameWithoutExtension(filename)中,同样的行为是显而易见的(例如,它在最后两个示例中报告文件名,而不是扩展名,只是这是一个文件).

所以我从这里得出的结论是,.NET和Windows的区别在于他们认为是扩展.

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

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

因为这将使我的代码的正确扩展的定义更符合Windows对待事情.还是有一些我在这里缺少的东西,明确地说我必须允许我的扩展中的空格?

我搜索并找到了this slightly similar question,但是其中链接的文档仅指定不推荐使用空格/期限结束扩展 – 他们对扩展名中的空格一无所知.

解决方法 Windows中的文件名扩展纯粹是一个惯例. GetExtension和HasExtension方法仅在文件名中查找一个点,并相应地执行.你可以随意把空格放在你喜欢的文件名中(包括扩展名).

当你说“Windows也这么认为”的时候,资源管理器中的一些代码实际上只是解析出扩展,而只是使用与.NET不同的算法.