【发布时间】:2013-08-07 17:13:57
【问题描述】:
我只需要检查一个目录是否存在!但是如果目录是“E:\Test”,其中 E: 是 CD/DVD 驱动器,并且没有插入磁盘,我会看到以下 Delphi 和 Windows 问题。
第一种方法:
function DirExists(Name: string): Boolean;
var
Code: Integer;
begin
Code := GetFileAttributesW(PChar(Name));
Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;
它给出Range Check Error。我不能使用{$RANGECHECKS OFF}、{$RANGECHECKS ON} 块,因为:
- 它打破了
$RANGECHECKS选项的当前状态。 - 我们将看到另一个系统错误
Drive is not ready而不是Range Check Error。但我只需要检查目录是否存在,而不会为用户提供任何错误对话框。
第二种方法:
if DirectoryExists(Name, True) then ...
对于空 CD/DVD 驱动器上不存在的 E:\Test 目录,此函数返回 True。所以不能使用它,因为它工作不正确。
那么,如何判断一个目录是否存在呢?
附注我认为任何 CD/DVD 驱动器都存在该错误。但是我在带有外部 CD/DVD 驱动器的 Mac OS X 10.8.4 下的 VMWare Fusion 5 上使用 Windows 7 x64。
【问题讨论】:
-
太奇怪了——
DirectoryExists()确实在我的 PC 中为空的 DVD 驱动器返回 true。使用 Delphi XE 和 Windows 8。 -
如何正确书写?
-
这是目录存在的长期错误。 See here。我不知道手头的解决方案。
-
在 XE3 中,他们添加了对
ERROR_NOT_READY的检查以“修复”此问题。在我看来,一切都很虚假。 -
@Altaveron 它不应该在 XE3+ 中修复;它应该在 XE2 中修复。当我出售软件时,由我们端的某些东西引起的任何问题都会在软件的生命周期内免费修复。当您销售软件时,您会说“产品做 X”。如果它不执行 X(错误),那就是在撒谎。拒绝履行交易(修复软件以使其执行 X)是在欺骗客户,恕我直言。 EMBT 一直在要求更新以修复错误,这也是开源开发工具击败它们的众多原因之一。
标签: delphi filesystems delphi-xe2