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中文件名的扩展名纯粹是一种约定.该GetExtension和HasExtension方法仅查找文件名中的一个点,并采取相应的行动.您可以随意在文件名(包括扩展名)中的任何位置放置空格.
当你说"Windows也这么认为"时,它实际上只是资源管理器中的一些代码试图解析扩展,它只是使用与.NET略有不同的算法.
文件系统如何处理名称和 Windows shell(即资源管理器)如何处理文件名是两种完全不同的野兽。
文件系统不关心空格、点或其他任何东西——对它来说,文件名只是一个不透明的字符串(对允许的字符有一些限制)。名称/扩展名分离只是一个虚构的约定。另一方面,shell 可以自由地解释扩展名是什么,因为它的目的不是存储和检索文件信息,而是为用户提供更好的体验。所以不要去那里寻找答案。
我建议使用System.IO方法返回的内容(因为遵循约定是好的),但是如果有充分的理由,您可以在代码中做任何您喜欢的事情。
| 归档时间: |
|
| 查看次数: |
1496 次 |
| 最近记录: |