44
System.IO.File.Exists(string path)

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

4

12 回答 12

52

很可能是权限问题。从文档中:

如果在尝试确定指定文件是否存在时发生任何错误,Exists 方法将返回 false。这可能发生在引发异常的情况下,例如传递包含无效字符或过多字符的文件名、磁盘故障或丢失,或者调用者没有读取文件的权限。

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

于 2013-08-16T05:53:02.227 回答
16

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

于 2017-04-12T20:49:38.067 回答
13

此处任何答案中未提及的一种可能性是Windows 8.1 及更高版本上的“文件系统重定向” 。

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

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

于 2017-09-22T19:11:23.440 回答
6

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

于 2018-10-28T16:19:34.603 回答
6

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

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

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

于 2017-06-02T19:46:34.597 回答
5

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

System.IO.File.Exists(Server.MapPath(string path))
于 2015-09-14T11:12:04.453 回答
2

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

于 2017-09-22T14:28:49.020 回答
1

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

于 2016-02-04T21:23:52.203 回答
0

这里还有一个,这让我花了太长时间才知道。

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

显然,您可以编写带有尾随空格的文件名,但 File.Exists 将其修剪掉并且无法识别它。当我消除尾随空格时, File.Exists 按预期工作。

于 2020-05-05T16:19:48.870 回答
0

我今天刚刚了解到 System.IO.File.Exists 将返回 false 如果文件存在但为空

于 2020-03-13T22:33:51.733 回答
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;
    }
于 2020-07-20T03:29:10.607 回答
0

System.IO.File.Exists(string path) 在尝试读取时为我返回了 false C:\OpenSSL\bin\file.txt。在管理员模式下运行应用程序没有帮助。(我登录的是管理员帐户,Windows 10)一旦我将文件移动到C:\Users\MyUser\Desktop\file.txt, File.Exists() 返回 true。

于 2018-10-25T11:19:37.537 回答