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

时间:2013-08-16 05:51:28

标签: c# file io

System.IO.File.Exists(string path)
即使文件存在于指定路径上,

也始终返回false。可能的解决方案是什么?

11 个答案:

答案 0 :(得分:43)

这可能是一个许可问题。来自documentation

  

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

查看正在发生的事情的一种方法是尝试读取文件(例如,使用File.OpenRead)。如果成功,我会感到惊讶 - 但如果失败,该异常应该会为您提供更多信息。

答案 1 :(得分:8)

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

答案 2 :(得分:5)

此处任何答案中未提及的一种可能性是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

答案 3 :(得分:1)

我自己也经历过这种情况。就我而言,我正在删除该文件并重新创建它。在删除文件的过程中,我忘记在稍后使用WaitForExit()之前添加File.Exists

答案 4 :(得分: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

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

答案 5 :(得分:1)

当我在本地调试服务时,我感到困惑了一段时间,我在我的工作站上映射的服务器位置运行File.Exists(" U:\ dir1")作为(U :) 。我将U:\ dir1替换为" \\ serverPath \ dir1"然后File.Exists返回true。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

System.IO.File.Exists(字符串路径)在尝试读取C:\OpenSSL\bin\file.txt时为我返回了false。 在管理员模式下运行该应用程序无济于事。 (我已登录管理员帐户,Windows 10) 将文件移至C:\Users\MyUser\Desktop\file.txt后,File.Exists()返回true。

答案 8 :(得分:0)

我今天才得知,如果文件存在但为空,System.IO.File.Exists将返回false

答案 9 :(得分:0)

还有一个,这使我花了太长时间以至于无法适应。

文件名位于用于写入文件的构造变量中,然后用于检查是否已成功写入该变量的相同变量,因此它不可能是'-'的不同版本。我在Linux上运行mono,并以与通常由/ as运行程序不同的用户身份进行调试。这些类型的错误中有许多与权限有关,我花了一些时间对此表示怀疑。当File.OpenRead也抛出“找不到文件”时,我终于注意到我的文件名末尾有一个空格字符。我只有在复制异常消息时才看到此消息,该消息在文件名字符串周围显示引号,并显示出包含的空格。

显然,您可以在文件名后加上空格,但是File.Exists会将其修剪掉并且无法识别。当我消除了尾随空间File.Exists时,按预期方式工作。

答案 10 :(得分:0)

可能需要使用DirectoryProvider Refresh()过程从Exists函数中获取正确的结果。

例如代码如下:

    private DirectoryInfo CreateDirectory(string folderPath, int code, string message)
    {
        DirectoryInfo di;
        try
        {
            di = DirectoryProvider.CreateDirectory(folderPath);
        }
        catch
        {
            throw new WebServiceException(code, HttpStatusCode.BadRequest, message);
        }

        di.Refresh();

        if (!DirectoryProvider.Exists(di))
        {
            throw new WebServiceException(code, HttpStatusCode.BadRequest, message);
        }

        return di;
    }