【问题标题】:File.Exists - Wrong?File.Exists - 错了吗?
【发布时间】:2012-05-20 19:14:08
【问题描述】:

我正在尝试查看图片是否存在,但这表示不存在,并且路径是正确的! 路径是正确的,并且有图片,但这总是转到“else”。

string path = @"c:\folder\pic.jpg";

if (File.Exists(path))
{ 
    //Do something here 
}
else 
{
}

【问题讨论】:

  • 您必须采用文件的绝对路径而不是目录本身。
  • -1:当问题的性质通过纠正一个疏忽的错误而完全改变时,这是没有帮助的。通过编辑,除了 Skeet 的所有答案都无关紧要。
  • 只需删除检查(它不是万无一失的)并打开文件。如果有例外,你会学到一些东西。
  • 如果您从 IIS 运行此程序,则运行您的应用程序池的用户帐户必须对此目录具有读取权限。最简单的方法是让 IIS_USRS 帐户 (win vista / 7 / 2008) 帐户访问该文件夹。否则将目录移动到应用程序所在的内部。
  • @Henk - 这取决于场景。对于测试项目/开发,可以将它们放在正在运行的应用程序目录之外。在生产环境中它永远不会飞。基于这个问题 - 我怀疑这是针对具有安全隐患的生产应用程序。

标签: c# asp.net path


【解决方案1】:

可能是权限问题。来自the documentation

如果调用者没有足够的权限读取指定的文件,则不抛出异常,并且无论路径是否存在,该方法都返回false。

当然,这意味着您在运行 Web 应用程序(通常在降低的权限下运行)时比客户端应用程序更有可能看到此问题。

此外,如 deerchao 的评论中所述,File.Exists 仅在给定的路径是 文件 而不是目录时才返回 true。同样,来自文档:

如果 path 描述了一个目录,则此方法返回 false。

【讨论】:

    【解决方案2】:

    您正在尝试使用File.Exists 查看是否存在文件夹。这是不正确的 - 目录会失败。

    使用Directory.Exists 查找目录是否存在。

    string path = @"c:\folder";
    
    if (Directory.Exists(path))
    { 
        //Do something here 
    }
    else 
    {
    }
    

    另外一个复杂的问题是,运行您的应用程序的帐户需要具有读取路径的权限 - 如果它没有权限,即使路径存在,它仍然会失败。

    【讨论】:

      【解决方案3】:

      我假设您正在尝试检查指定目录中是否存在任何文件?在这种情况下,您可以使用:

      string path = @"c:\folder";
      
      if (Directory.Exists(path) &&
          Directory.GetFiles(path).Any())
      {
          //Do something here 
      }
      else
      {
      }
      

      在 .NET 4 及更高版本中,您可以通过将 GetFiles 调用替换为 EnumerateFiles 来优化第二次检查。

      【讨论】:

      • 对不起,我忘了说这是一个文件/图片而不是一个目录!
      • @DiogoSeveriano:如果您以后选择更合适的文件名会有所帮助。 “文件夹”这个名称强烈暗示文件夹/目录,而不是文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2014-11-24
      • 2010-12-15
      • 2020-12-31
      • 2013-11-08
      • 1970-01-01
      相关资源
      最近更新 更多