为什么System.IO.File.Exists(字符串路径)返回false?

Shi*_*oni 29 c# io file

System.IO.File.Exists(string path)
Run Code Online (Sandbox Code Playgroud)

即使文件存在于指定路径上,也始终返回false.可能的解决方案是什么?

Jon*_*eet 45

这可能是一个许可问题.从文档:

如果在尝试确定指定文件是否存在时发生任何错误,则Exists方法返回false.在引发异常的情况下会发生这种情况,例如传递带有无效字符或字符太多的文件名,磁盘失败或丢失,或者调用者没有读取文件的权限.

查看正在发生的事情的一种方法是尝试读取文件(例如File.OpenRead).如果成功,我会感到惊讶- 但是如果它失败了,那么例外应该会给你更多的信息.

  • File.OpenRead为我工作.但File.Exists仍然返回false ..我很困惑...... (6认同)
  • @Vlad 是的,这里也一样。我正在使用模拟上下文 - 我不知道这是否与此有关。但如果它可以读取它——我什至创建了一个“Stream s = File.OpenRead(path);”并使用一个函数将字节读入字节数组!-- 我不知道为什么它不能为 `bool fileExists = File.Exists(path);` 返回 `true`; 实际上,对我来说,文件路径中的“字符太多”可能就是这样。 (2认同)

小智 9

我也对此感到困惑,然后意识到我应该使用 Directory.Exists 时却使用了 File.Exists。


小智 8

在Windows中隐藏文件结尾有时会引起混淆:你知道你的文件名为file.txt,当它实际命名为file.txt.txt时,因为操作系统已经隐藏了最后4个字符.

  • *捏鼻梁 - ahhhhhhhhhhhh (3认同)
  • 删除文件名中的扩展名对我有用..thankuu :) (2认同)

NGa*_*bit 7

此处任何答案中未提及的一种可能性是Windows 8.1以后的"文件系统重定向".

例如,如果您的程序是32位应用程序并且您在64位Windows上运行,那么尝试访问%windir%\ System32将被重定向到%windir%\ SysWOW64.如果%windir%\ SysWOW64中不存在您尝试访问的文件,则System.IO.File.Exists(字符串路径)将返回False.

链接到解释此行为的好文章

  • 太感谢了!!!!!!!!!!!我被困在这个问题上,我不知道,至少四个小时。 (2认同)
  • 非常感谢您的提示。在 64 位 CPU 上的 32 位应用程序上,“%windir%\Sysnative”被重定向到“%windir%\System32”。在 64 位应用程序或 32 位 CPU 上的 32 位应用程序上,“%windir%\Sysnative”不存在。另请参阅:https://learn.microsoft.com/en-us/windows/win32/winprog64/file-system-redirector (2认同)

Rm5*_*558 6

就我而言,文件名中的不同“破折号”会导致问题。

var f1 = "4-37R.pdf";
var f2 = "4?37R.pdf";
var r = f1==f2?"same":"diff";
Console.Write(r); //diff
Run Code Online (Sandbox Code Playgroud)

结果

var c1 = '-';
var c2 = '?';
Console.WriteLine((int)c1); //45
Console.WriteLine((int)c2); //8208
Run Code Online (Sandbox Code Playgroud)

使用相同的“-”解决问题。

  • 在看到我的情况也是如此后,我的下巴仍然在地上。谁曾想到? (2认同)

F U*_*F U 5

我如何解决这个问题,是Server.MapPath(fileName)因为它一直试图在其他地方查找文件。

System.IO.File.Exists(Server.MapPath(string path))
Run Code Online (Sandbox Code Playgroud)

  • 有谁知道这是否是 .NET 版本之间的差异或其他什么?在应用程序升级到 .NET 4.5 之前,这曾经有效。现在突然就成了一个问题了。 (2认同)
  • 我认为在网络项目中必须首先检查这个问题。 (2认同)