【问题标题】:System.IO.Directory.Exists does not work as expectedSystem.IO.Directory.Exists 无法按预期工作
【发布时间】:2019-02-04 09:12:16
【问题描述】:

当字符串 "D:\test\..." 传递给 System.IO.Directory.Exists 方法时,它在我的机器上返回 True。我检查了以下代码;

public static void Main(string[] args)
{
    if (Directory.Exists("D:\\test\\..."))
        Console.WriteLine("Directory exist.");  //Control gets here
    else
        Console.WriteLine("Does not exist.");
}

即使指定位置不存在名为“...”(三个点)的目录,也会发生这种情况。

对此的进一步调查表明,不知何故,它在内部只是通过完全忽略字符串的最后一部分来检查“D:”。由于父目录存在,所以返回true。

我想知道有没有什么方法可以在不切断尾随点的情况下进行检查?

是否存在Directory.Exists 方法的结果可能与预期不同的情况?

更新: 如果我在 Windows 资源管理器的地址栏中输入相同的字符串“D:\test\...”并回车,则可以识别出找不到该目录。有没有办法获得类似的行为?

注意:我知道这个名称的目录不存在,但我从用户那里得到输入字符串,所以这个方法的输入可以是任何东西。

【问题讨论】:

  • 首先通过 IO.Path.GetFullPath() 输入文本,它会处理这些点并让您知道文件系统真正考虑的地方。三个点将被解释为 dot-dot=up 然后 dot=here。另一个虚构的文件是NUL,我认为旧的COM1、COM2等仍然存在
  • 永远不要调用这个函数。它在规范中存在错误。
  • ... 无论如何都是无效目录,您不能创建这样的目录。
  • input string from user, so input to this method could be anything ...好吧,但有时甚至用户也需要动动脑筋;)

标签: c# .net system.io.directory


【解决方案1】:

我认为这是 Win32 的一种行为。

事实上,如果我通过以下命令创建一个名为... 的文件夹(以正常方式创建文件夹是不允许的):

mkdir \\?\c:\...

文件夹 ... 重定向到 C:\ 本身。所以我认为文件夹... 代表当前文件夹(在本例中为 C:\)并且它始终存在。

【讨论】:

    【解决方案2】:

    因为你又要去“D:\”磁盘了。

    转义字符表达式“D:\test\...”表示名为“D”的磁盘,它就在那里。

    如果您更改磁盘盘符。你会得到“不存在”。这是你的答案。

    D:\ --> D:\test --> .. 命令并再次进入 D:\。

    并且您不能创建名为“...”的文件夹。你会得到“参数不正确”的错误。

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2014-12-09
      • 2016-01-13
      • 2020-09-21
      • 2011-08-17
      • 2012-04-29
      • 2021-08-12
      • 2014-12-02
      • 2013-12-02
      相关资源
      最近更新 更多