【问题标题】:What is the purpose of File.Exists if not path validation?如果不是路径验证,File.Exists 的目的是什么?
【发布时间】:2014-10-01 14:54:25
【问题描述】:

在阅读System.IO.File.Exists(string path)的方法时,被这句话迷惑了

Exists 方法不应该用于路径验证,这个方法 仅检查路径中指定的文件是否存在。

对我来说,“此路径中的文件存在”和“[文件] 的路径有效”这两个语句几乎是同义词,所以我遗漏了一些东西。什么?为什么我不应该使用File.Exists() 验证路径?

【问题讨论】:

  • 因为路径末尾的文件可能不存在,但你的路径可以。或者,最好说“如果它看起来像鸭子,叫起来像鸭子,闻起来像鸭子,那么它应该验证它所说的正在验证的东西”。
  • 我的第一个想法是提醒您File.Exists 不会确认给定路径是否有效 - 这意味着像 1ekj2#34\/3423&*^%* 这样的东西不是有效路径或(因此)文件。然而,那段话的措辞让我觉得可能还有其他事情......
  • @CBauer 好吧,显然 File.Exists() 关注的是文件的路径,而不是目录,即 Directory.Exists()。你建议这句话的意思是“不要用它来验证包含目录的路径”?
  • 顺便说一句,这不是 c# 的东西,它是 .Net BCL,因为这对于任何 .Net 语言都是一样的
  • @PeterSchneider 我的意思是,如果您编写的代码显示“CheckDirectory()”并检查该目录中的特定文件,那么该方法的名称具有误导性,如果该特定文件可能会失败文件不存在,即使它通常会存在。

标签: .net msdn


【解决方案1】:

因为下一句:

将无效路径传递给 Exists 会返回 false

通常总是会产生异常。只是不是在 File.Exists() 的情况下:

   bool miracle = File.Exists(":::");

所以要小心,该文件可能确实存在,但您可能只是摸索了字符串。你不能说,没有例外会警告你。

请记住,这不是 File.Exists() 的问题所在。您也不能信任 true 返回值。在多任务操作系统上运行代码的危险,文件可能会在一纳秒后被另一个进程删除。当然,这可能会导致一些非常令人费解的崩溃:) 最好完全避免它,只需尝试打开文件(这是原子的)并在不存在时捕获异常。

【讨论】:

  • 并传递有效路径?还是假的。也许这是第一句话的另一个含义?
  • 我明白了。它们的意思是句法“验证”。嗯。这可以使用 FileInfo (stackoverflow.com/questions/422090/… 并感谢 open() 的提示,值得牢记。
【解决方案2】:

如果路径在语法上不正确怎么办? Exists() 将返回 false ,暗示您现在可以创建该文件,这是不正确的。

【讨论】:

  • 好吧,只有没有阅读过文档的人才会这样做;-)。
  • 是的,我认为这个简短的答案很重要:MSDN 的“验证”是在语法上的意思,当我重新阅读他们关于如何测试无效的段落的其余部分时(现在)变得很清楚字符。我猜我的想法是“但我 am 验证非常成功!”太根深蒂固了。
【解决方案3】:

因为这是两个不同的东西......正如 C Bauer 指出的那样,路径可以存在,但文件可能不存在。

如果路径不存在,这将抛出一个异常,但如果路径末尾的文件不存在,这将返回 false,您可以在 if 语句中使用它。如何使用它的一个例子是:

if(System.IO.File.Exists(path))
{
    //write to this file
}
else
{
    //create the file then write to it...
}

我一直将它用于软件中的日志文件,因此我可以有一个函数来完成对文件的所有写入,并且在第一次调用该函数时它只会创建文件然后写入它。每隔一段时间它只会在文件中添加行。

编辑:拼写

【讨论】:

  • File.Exists() 不会抛出不存在的目录。尝试在那里创建文件。
【解决方案4】:

我认为这意味着......

如果该文件存在于该路径中.. FOUND

如果该路径中不存在该路径... NOT FOUND

但是如果文件不存在并且你给出了一个NOT OK...这并不意味着路径不存在...这意味着文件不存在..

你可以有路径,但不能有文件,然后返回 NOT FOUND

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2020-10-30
    • 2017-10-30
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多