我在这里完全感到困惑,
我的代码抛出异常,因为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是文件的绝对路径。我不是在创建文件,也不是写文件(它一直都在那里)。如果我将路径粘贴到记事本中的打开对话框中,它会毫无问题地读取文件。
代码在后台工作程序中执行。这是我能想到的唯一复杂因素。我很肯定文件还没有在工作线程或其他地方打开过。
这里发生了什么?
答案 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都可以解决。