2013-08-16 126 views
20
System.IO.File.Exists(string path) 

即使文件存在于指定的路径上,也会始终返回false。可能的解决方案是什么?为什么System.IO.File.Exists(string path)返回false?

+5

*如果主叫方没有足够的权限读取指定的文件,没有抛出异常,不管该方法返回路径的存在的假。* – V4Vendetta

+1

可能是关于不足的特权?尝试以管理员身份运行exe。 –

回答

36

这可能是一个权限问题。从documentation

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

看到发生了什么的一种方法是试图读取文件(例如使用File.OpenRead)。如果成功,我会感到惊讶 - 但是如果失败,例外应该会提供更多信息。

+5

File.OpenRead为我工作。但File.Exists仍然返回false ..我很困惑... – Vlad

+0

@ Vlad Yep,同样在这里。我正在使用模拟上下文 - 我不知道这与它有什么关系。但是如果它可以读取它 - 我甚至创建了一个'Stream s = File.OpenRead(path);'并使用一个函数将字节读入到一个字节数组中! - 我不知道为什么它不能为'bool fileExists = File.Exists(path);'返回'true';实际上,对我来说,文件路径中的“太多字符”可能就是这样。 – vapcguy

3

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

System.IO.File.Exists(Server.MapPath(string path)) 
+0

有谁知道这是.NET版本之间的区别吗?这在应用程序升级到.NET 4.5之前就已经开始工作了。现在突然间,这是一个问题。 –

+0

这不会在Windows应用程序的工作,遗憾的是 – MC9000

0

我也在亲身经历这个。就我而言,我正在删除该文件并重新创建它。在删除文件的过程中,我忘记了在使用File.Exists之前在WaitForExit()之前添加

-3

使用\\而不是@。例如:

@ “C:\ file.txt的” - > “C:\\ file.txt的”

5

在窗口隐藏的文件结尾有时会引起混乱:你知道你的文件被命名为文件。因为最后4个字符被操作系统隐藏了,所以它实际上被命名为file.txt.txt。

+0

删除在文件名扩展为我工作.. thankuu :) – Deepzz

+0

*捏鼻梁 - ahhhhhhhhhhhh – rory

1

在我的情况下,文件名中的不同“破折号”导致该问题。

var f1 = "4-37R.pdf"; 
var f2 = "4‐37R.pdf"; 
var r = f1==f2?"same":"diff"; 
Console.Write(r); //diff 

原来

var c1 = '-'; 
var c2 = '‐'; 
Console.WriteLine((int)c1); //45 
Console.WriteLine((int)c2); //8208 

使用相同的 ' - ' 修复该问题。

1

当我在本地调试服务时,这让我难住了一段时间,我对映射在我的工作站上的服务器位置(U :)运行File.Exists(“U:\ dir1”)。我将U:\ dir1替换为“\\ serverPath \ dir1”,然后File.Exists返回true。

4

在这里的任何答案中没有提到的一种可能性是在Windows 8.1之后的“文件系统重定向”。例如,如果您的程序是32位应用程序,并且您在64位Windows上运行,则尝试访问%windir%\ System32将被重定向到%windir%\ SysWOW64。如果您尝试访问的文件不存在于%windir%\ SysWOW64中,则System.IO.File.Exists(字符串路径)将返回False。

Link to a nice article explaining this behavior

+0

非常感谢你!!!!!!!!!!!至少四个小时,我被困在这里,我不知道。 –

相关问题