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

时间:2010-03-07 19:16:50

标签: c# .net visual-studio-2008 backgroundworker

我在这里完全感到困惑,

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

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

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

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

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

这里发生了什么?

8 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

嗯,您的文件名的路径是什么?请记住,当您构建调试和发布时,您编译到不同的文件夹。因此,如果您将文件放在调试文件夹中,则在执行发布版本时将无法找到它。

答案 3 :(得分:1)

我也遇到过这个问题。问题是您直接在函数file.exist("complete path manually")中绑定路径。不应该这样,你应该写server.mappath("yourfolder name where file resides"),然后将它与你的图像连接起来。

答案 4 :(得分:1)

尝试添加" .ToString()"到了路上。例如:

if (!File.Exists(fileName.ToString()))
{
    throw new ArgumentException("Provided file name does not exist", "fileName");
}

或者如果要加入字符串,请将其放在括号中,然后" .ToString":

if (!File.Exists((filePath + "SomeRandomName").ToString()))
{
    throw new ArgumentException("Provided file name does not exist", "fileName");
}

(来自问题)

我不能理解为什么" .ToString()"需要放在那里,但似乎有帮助......

答案 5 :(得分:1)

尝试以这种方式编写:

if (!Server.Map(fileName)) 

答案 6 :(得分:0)

嗯,这次检查后你做了什么?在再次拖动断点之前,请确保清理文件状态。

答案 7 :(得分:0)

我遇到了同样的问题,发现将Debug和Release配置从AnyCPU更改为x64都可以解决。