文件扩展名后的空格 – >奇怪的FileInfo行为

不知何故,一个文件出现在我的一个目录中,并且在其扩展名末尾有空格 – 它的名字是“test.txt”。 奇怪的是, Directory.GetFiles()返回此文件的路径,但我无法使用FileInfo类检索文件信息。

错误在此处显示:

 DirectoryInfo di = new DirectoryInfo("c:\\somedir"); FileInfo fi = di.GetFileSystemInfos("test*")[0] as FileInfo; //correctly fi.FullName is "c:\somedir\test.txt " //but fi.Exists==false (!) 

FileInfo类是否已损坏? 我可以以某种方式检索有关此文件的信息吗? 我真的不知道该文件是如何出现在我的文件系统上的,我无法再重新创建它们。

我尝试使用这种类型的扩展创建新文件的所有尝试都失败了,但是现在我的程序在绑定它时崩溃了。 我可以在找到文件时轻松处理exception,但男孩我很好奇!

使用空格结束文件名记录为错误想法。

从MSDN “命名文件,路径和命名空间(Windows)” :

  • 不要使用空格或句点结束文件或目录名称。 虽然底层文件系统可能支持此类名称,但Windows shell和用户界面却不支持。

此外,知识库文章“INFO:文件名以空格或句点结束不支持” :

Macintosh客户端在Windows NT服务器上创建文件时可能会出现问题。 不执行删除尾随空格和句点的代码,Macintosh用户获取正确的标点文件名。 Win32 API FindFirstFile()FindNextFile()返回以空格或句点结尾的文件名; 但是,无法使用Win32 API创建或打开文件。

DirectoryInfo可能使用FindFirstFile()和朋友来生成目录列表。 File.Exists很可能是通过GetFileAttributes() ,它可能遇到与CreateFile()相同的问题,并报告一个不存在的文件。

因此,在.NET中没有特别的问题,但在Windows本身。

是的我知道这些文件。 我也曾经有过这样的野兽。 为了摆脱它,我不知道C#中的编程方式,但是好的旧命令行是你的朋友:

在给定文件夹中打开控制台窗口(或执行cmd并使用cd命令导航到该文件夹​​)。 现在输入dir /x以检索此目录中文件的短名称。 使用此名称可以使用delren命令删除或重命名该文件。