File.Exists()返回false,但不在调试中

Tor*_*gen 4 .net c# backgroundworker visual-studio-2008

我在这里完全糊涂了,

我的代码抛出异常,因为File.Exists()返回false

public override sealed TCargo ReadFile(string fileName)
{
    if (!File.Exists(fileName))
    {
        throw new ArgumentException("Provided file name does not exist", "fileName");
    }
Run Code Online (Sandbox Code Playgroud)

Visual Studio在throw语句中断,我立即检查File.Exists(fileName)在即时窗口中的值.它回来了true.当我将断点拖回到if语句并再次执行时,它会再次抛出.

fileName是文件的绝对路径.我不是在创建文件,也不是写文件(它一直都在那里).如果我将路径粘贴到记事本中的打开对话框中,它会毫无问题地读取文件.

代码在后台工作程序中执行.这是我能想到的唯一复杂因素.我很肯定文件还没有在工作线程或其他地方打开过.

这里发生了什么?

Ana*_*tts 13

我不知道发生了什么,但为什么你需要File.Exists测试呢?你真正感兴趣的是,"我可以阅读这个文件吗?" 除了File Not Found之外的其他许多东西都可能出错.

更不用说,执行File.Exists测试是一种竞争条件,因为在您完成测试之后,但在打开文件之前,文件可能会消失.只需打开文件,这是您可以做的最佳测试,以确定您是否可以读取该文件.

  • 我不同意这个说法.检查文件的存在*以及*捕获因尝试打开不存在的文件而导致的异常是明智的.与附加检查相比,例外可能是昂贵的,并且它使代码看起来更清晰. (6认同)
  • +1,这是唯一正确的方法.File.Exists主要用于锁定文件等情况,您只需要监视另一个进程来创建或删除文件,而实际上并不打算打开它. (3认同)
  • 好吧,即使File.Exists()继续返回false,代码进一步向下实际上会成功读取文件.所以我想我会在这里给你点数.但是仍然很神秘. (2认同)

小智 6

如果您没有权限访问引用的文件夹或文件,File.Exists将返回false.可能是您可以在immediates窗口中以管理员身份查看该文件,但在其他上下文中运行时您没有权限.