这个问题在XE8中仍然存在(可能也存在于其他版本中)。如上所指出的RRUZ,问题出在SysUtils实现的DirectoryExists()和TDirectory.Exists()两者之中。
问题出在那个冗长的“检查”列表上,它假设这些是“无效文件属性”在“文件夹存在”的上下文中被返回的
唯一有效原因。但我们调用这些例程的
几乎总是为了检查我们是否能够实际
使用所询问的文件夹。INVALID_FILE_ATTRIBUTES几乎总是意味着我们不能使用。无论哪种方式,目前正在进行的测试都不能产生合理的结果。仅此事实就使它成为完全多余的练习,因为它允许某些其他故障代码通过网络并将最终结果设置为TRUE,而不应该是这样。虽然我只能想象最初有一些方法来解决这种疯狂的方法,比如“哦,它存在但可能是无效的”,但它违反了未来可能会带来许多由尚未知道的文件系统和/或硬件生成的代码的内在真相:因此,对于99.9%的用途,获得
INVALID_FILE_ATTRIBUTES应该意味着
文件夹不可用,因此在已经建立了这一点之后允许返回TRUE是不合逻辑的。
很遗憾,我们无法确定是否存在依赖于当前行为来识别“存在问题路径”的代码 - 在这种情况下,现有的例程调用必须先进行路径语法验证检查:否则它会说一个用错误语法描述的路径“存在”,这是荒谬的!之后你不能重新执行GetLastError,因为错误已经被清除。
因此,唯一的解决方法是在任何Sysutils.DirectoryExists和(不幸的是)TDirectory.Exists调用周围包装消除问题的代码。例如:
DirectoryUsable(const Directory: string; FollowLink: Boolean = True): Boolean;
begin
Result := GetFileAttributes(PChar(Directory)) <> INVALID_FILE_ATTRIBUTES;
if Result then Result := DirectoryExists( Directory, FollowLink );
end;
要么这样,要么你对所有你所了解到的“坏”情况进行单独的前期验证,而Embarcadero却忽略了这些情况 - 也就是说,玩的是和他们一样的失败游戏。
可怕,但这就是现实。
你也可以自己修改SysUtils库,添加缺失的情况,但你需要在每个Delphi版本发布时重新做同样的工作,并且对于每个新的情况都要进行修改。也许Embarcadero最好能够“下定决心”,找到一个更好的解决方案来解决这个问题。也许可以通过使用另一个默认标志参数来实现,该参数表示“拒绝所有无效的目录”。我进一步建议将其默认设置为TRUE。
ERROR_NOT_READY
。但是当我运行代码时,我得到的是LastError
为ERROR_INVALID_NAME
,或者如果Y:
没有映射,则为ERROR_PATH_NOT_FOUND
。我从未见过ERROR_BAD_PATHNAME
。@RRUZ你使用的是哪个操作系统?一旦我们能够解决这个问题,似乎应该提交一个QC报告。 - David HeffernanDirectoryExists('Y:\blabla\Y:\bla')
返回true,但是这个DirectoryExists('Y:\blabla')
返回false。 - RRUZY:
网络驱动器并测试了代码? - RRUZ