【问题标题】:Directory.GetFiles finds nonexisting filesDirectory.GetFiles 找到不存在的文件
【发布时间】:2012-12-15 18:45:08
【问题描述】:

我刚刚偶然发现了 System.IO.DirectoryGetFiles 方法的未记录行为。

只要传递给方法的searchPattern 参数包含保留的Windows 设备名称,例如"nul.*""aux.bmp",该方法就会返回一个包含不存在文件名称的数组,例如C:\Users\ft1\nul 或@987654327 @等

我想知道这些设备名称是否在上下文中具有特殊含义,例如“。”或“..”,或者如果这只是一种错误。无论如何,这仍然看起来很奇怪。 比如这段C#代码sn-p:

string[] fileNames = Directory.GetFiles(@"C:\D:\..\..\...\", "con.txt");
foreach (string fileName in fileNames) Console.WriteLine(fileName);

打印

C:\D:\..\..\...\con

有什么线索吗?

【问题讨论】:

    标签: c# .net windows file getfiles


    【解决方案1】:

    这是众所周知的。这是一个关于Naming Files, Paths, and Namespaces (Windows)的操作系统设计

    摘录:

    请勿使用以下保留名称作为文件名: CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9。还要避免这些名称后跟扩展名;例如,不推荐使用 NUL.txt。有关详细信息,请参阅命名空间。

    这些基本上是文件名别名(命名空间),因此它们总是全局存在(在每个文件夹中)。如果你尝试枚举它们,你会得到它们,因为它们确实存在。

    【讨论】:

    • 您知道 .NET Framework 是否有任何内置的此类保留名称列表?
    • 这是一个很好的问题,作为一个实际的 SO 问题可能会更好,但由于问题 How check if given string is legal (allowed) file name under Windows? 已经被问到,我会给你链接。
    • 这完全正确 - 啊,处理遗留系统的代价......其中很多来自 DOS 时代。 :)
    • @JerKimball 这并不是真正的遗产,因为它只是拥有文本输入/输出界面所必须付出的代价。
    【解决方案2】:

    这些是 MSDOS/NTFS 的 reserved words

    来自Wikipedia

    此外,在 Windows 和 DOS 实用程序中,某些单词也可能被保留,不能用作文件名。比如DOS设备文件:

    CON, PRN, AUX, CLOCK$, NUL
    COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
    LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
    

    具有这些限制的系统会导致与其他一些文件系统不兼容。 例如,Windows 将无法处理这些合法的 UNIX 文件名或引发错误报告:aux.c、q"uote"s.txt 或 NUL.txt。

    内部使用的 NTFS 文件名包括:

    $Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure,
    $Upcase, $Extend, $Quota, $ObjId and $Reparse
    

    【讨论】:

    • 谢谢,我知道保留的 MSDOS 名称,但那些内部 NTFS 文件名对我来说是新的。我必须给他们看一下,因为我认为它们也可能会导致我的应用程序出现问题。
    【解决方案3】:

    作为对此的补充,在 MSTest dll 中使用 json 配置文件时存在相关问题。 当我调用它Test_Settings_Develop.json 时,Directory.GetFiles 找到了它,但说它不存在,所以我的测试在尝试加载它时无法运行。

    将其重命名为 TestSettings_Develop.json 并且成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2020-10-07
      • 2016-01-05
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多