gpt4 book ai didi

delphi - 如何*正确地*找出 Delphi XE2 上的目录是否存在?

转载 作者:行者123 更新时间:2023-12-03 15:22:09 32 4
gpt4 key购买 nike

我只需要检查目录是否存在!但是,如果目录是“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;

它给出范围检查错误。我无法使用 {$RANGECHECKS OFF}{$RANGECHECKS ON} block ,因为:

  1. 它破坏了 $RANGECHECKS 选项的当前状态。
  2. 我们将看到另一个系统错误驱动器未就绪,而不是范围检查错误。但我只需要检查目录是否存在而不为用户提供任何错误对话框。

第二种方法:

if DirectoryExists(Name, True) then ...

对于空 CD/DVD 驱动器上不存在的 E:\Test 目录,此函数返回 True。因此无法使用它,因为它工作不正确。

那么,如何判断一个目录是否存在呢?

P.S.我认为任何 CD/DVD 驱动器都存在此错误。但我在 Mac OS X 10.8.4 下的 VMWare Fusion 5 上使用 Windows 7 x64,并带有外部 CD/DVD 驱动器。

最佳答案

您可以修复您的函数,这样它就不会导致范围检查错误:

function DirExists(Name: string): Boolean;
var
Code: DWORD;
begin
Code := GetFileAttributes(PChar(Name));
Result := (Code <> INVALID_FILE_ATTRIBUTES)
and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;

范围检查错误是由于您混合有符号和无符号类型造成的。 Remy 还指出了设置编译器选项然后恢复到当前状态的非常有用的技巧。这是一个值得学习的好技巧,但您在这里不需要它。

DirectoryExists 的 XE3 实现已进行修改,以解决您遇到的问题。因此,如果可以选择使用 XE3+,那么您应该选择它。

<小时/>

要抑制系统错误对话框,请在进程启动时调用此命令:

procedure SetProcessErrorMode;
var
Mode: DWORD;
begin
Mode := SetErrorMode(SEM_FAILCRITICALERRORS);
SetErrorMode(Mode or SEM_FAILCRITICALERRORS);
end;

这样做是最佳实践,如 MSDN 中所述。 :

Best practice is that all applications call the process- wide SetErrorMode function with a parameter of SEM_ FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application.

关于delphi - 如何*正确地*找出 Delphi XE2 上的目录是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109633/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com