7

不知何故,一个文件出现在我的一个目录中,它的扩展名末尾有空格 - 它的名字是“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 类是否损坏?我可以以某种方式检索有关此文件的信息吗?我真的不知道该文件是如何出现在我的文件系统上的,我无法重新创建更多文件。

我所有使用这种扩展名创建新文件的尝试都失败了,但是现在我的程序在遇到它时崩溃了。查找文件时我可以轻松处理异常,但是男孩我对此感到好奇!

4

3 回答 3

6

以空格结尾的文件名被记录为一个坏主意。

来自 MSDN “命名文件、路径和命名空间 (Windows)”

  • 不要以空格或句点结尾的文件或目录名称。尽管底层文件系统可能支持此类名称,但 Windows shell 和用户界面不支持。

此外,知识库文章“信息:不支持以空格或句点结尾的文件名”

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

DirectoryInfo可能使用FindFirstFile()和朋友制作目录列表。File.Exists最有可能通过GetFileAttributes()它实现可能会遇到与相同的问题CreateFile()并将报告不存在的文件。

因此,这不是 .NET 中的问题,而是 Windows 本身中的问题。

于 2010-04-30T07:12:49.683 回答
4

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

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

于 2010-04-30T07:15:31.213 回答
0

如果使用\\?\路径语法,则可以操作带有尾随空格的文件(以及其他极端情况):\\?\c:\somedir\test.txt .

于 2021-02-15T00:29:48.553 回答