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,即使文件存在的主要内容,如果未能解决你的问题,请参考以下文章
即使注册成功,isRegisteredForRemoteNotifications 也会返回 false
Java contains() 方法返回 False,即使重写 equals() 返回 True