FileExists() 返回 false,即使文件存在

Posted

技术标签:

【中文标题】FileExists() 返回 false,即使文件存在【英文标题】:FileExists() returns false, even if file exists 【发布时间】:2011-11-29 10:49:56 【问题描述】:

我想检查 System32 目录 (Windows 7) 中的 dll 是否存在。但即使它存在,FileExists() 也会返回 false。 LoadLibrary 返回一个有效的句柄。 在这种情况下,我只想检查文件是否存在并可视化此信息。 你有什么技巧可以解决这个问题吗?

【问题讨论】:

我猜是“权限”问题。 Vista/Windows 7 对让人们在 \windows 中乱七八糟非常有保护性 :) @paulsm4:不,不可能。 Windows 将始终让您找出文件是否存在。 【参考方案1】:

没有太多信息可以继续,您使用的代码可能会有所帮助,但这可能是 64 位问题并且 dll 实际上位于 SysWOW64 文件夹中吗?请参阅 here 了解其工作原理。

【讨论】:

【参考方案2】:

您几乎可以肯定没有在FileExists 调用中指定文件的完整或有效相对路径。 LoadLibrary 将为您搜索某些位置(预计 dll 将驻留的位置),但 FileExists 不会。提供完整且正确的路径,FileExists 将正常工作。

【讨论】:

【参考方案3】:

这很可能归结为文件重定向。您有一台 64 位机器,但从 32 位 Delphi 进程中,Windows\system32 实际上重定向到Windows\Syswow64。因此,当您认为您在询问 Windows\system32 中是否存在文件时,系统实际上是在报告 Windows\Syswow64 中存在(或其他)文件。

如果您确实需要查看真正的 64 位系统32,那么您需要禁用文件重定向。您可以使用 Wow64DisableWow64FsRedirection() 函数执行此操作。不要忘记使用Wow64RevertWow64FsRedirection() 重新打开它。请注意,禁用重定向器会产生广泛的影响,并可能导致非常奇怪的行为,因此请谨慎操作。

【讨论】:

这个比较像。 (嗯,这个和一些愚蠢的错字,当然......) 现在我想起来了,我是 99% 这就是问题所在。 +1,绝对的。 是的,可能是这样,过去我也有类似的情况,奇怪的是我的总指挥官也向我展示了重定向的文件夹,在有人告诉我这是因为它是 32 位之后一切都清楚了.(您仍然可以在那里禁用重定向)。反正刚刚查了一下 TC 网站,现在有一个 64 位测试版。 您可以使用特殊的“Sysnative”别名来访问 64 位 System32 文件夹而不禁用文件系统重定向,例如:FileExists('C:\Windows\Sysnative\filename.dll') @Remy 这点很好,但是如果您希望支持 XP 64,那么您需要确保安装了相关的修补程序。【参考方案4】:

这是最可笑的理由,但如果它只能帮助一个人......

确保您没有不小心将文件命名为 something.dll.dll

我刚刚在客户端计算机上安装了一个应用程序,然后该应用程序在同一目录中找不到config.txt。这在其他计算机上运行良好,所以我当然被难住了。

原来在这台客户端计算机上关闭了“显示文件扩展名”设置,并且该文件实际上被命名为config.txt.txt...在我的辩护中,我将 90% 的时间花在 OSx 上,还有 9.99%在我自己的 Windows 系统上,很久以前就启用了“显示文件扩展名”。

【讨论】:

以上是关于FileExists() 返回 false,即使文件存在的主要内容,如果未能解决你的问题,请参考以下文章

AnsiString和UnicodeString的区别

即使应该返回 false,循环也会返回 true

即使注册成功,isRegisteredForRemoteNotifications 也会返回 false

Java contains() 方法返回 False,即使重写 equals() 返回 True

List.Contains 返回 false,即使它看起来应该返回 true

即使正在检查其中一个收音机,表单仍然返回 false