查看: 57|回覆: 1

[原创]Delphi 目录函数:ForceDirectories 和 CreateDir 的详细介绍

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2009-4-30
發表於 2019-7-30 16:48:00 | 顯示全部樓層 |閲讀模式

[原创]Delphi 目录函数:ForceDirectories 和 CreateDir 的详细介绍

引用单元:SysUtils

1、CreateDir 创建一个新目录

function CreateDir(const Dir: string): Boolean;   //创建一级目录  父目录必需存在
function CreateDir(const Dir: string): Boolean;
begin
  Result := CreateDirectory(PChar(Dir), nil);
end;

返回值:如果成功创建了新目录,则返回值为true;如果发生错误,则返回值为false。

2、ForceDirectories  创建新目录,包括根据需要创建父目录。

function ForceDirectories(Dir: string): Boolean;    //创建多级目录  父目录不必存在   (Force 有暴力、强制的意思)   
function ForceDirectories(Dir: string): Boolean;
var
  E: EInOutError;
begin
  Result := True;
  if Dir = '' then
  begin
    E := EInOutError.CreateRes(@SCannotCreateDir);
    E.ErrorCode := 3;
    raise E;
  end;
  Dir := ExcludeTrailingPathDelimiter(Dir);
{$IFDEF MSWINDOWS}
  if (Length(Dir) < 3) or DirectoryExists(Dir)
    or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem.
{$ENDIF}
{$IFDEF LINUX}
  if (Dir = '') or DirectoryExists(Dir) then Exit;
{$ENDIF}
  Result := ForceDirectories(ExtractFilePath(Dir)) and CreateDir(Dir);
end;

ForceDirectory按照Dir中的指定创建一个新目录,该目录必须是完全限定的路径名。如果路径中给出的目录尚不存在,ForceDirectory会尝试创建它们。

返回值:如果ForceDirectory成功创建了所有必要的目录,则返回true;如果无法创建所需的目录,则返回false。

重要提示:不要使用空字符串调用ForceDirectory。这样做会导致ForceDirectory引发异常。

FileCtrl单元(仅限Windows)还包含ForceDirectory函数。但是,不推荐使用FileCtrl版本,而首选SysUtils版本,即使代码不需要跨平台。

3、CreateDir 和 ForceDirectories 的 区别

//例如:现有目录:D:\目录1

//想要创建:D:\目录1\目录2\目录3\目录4  不存在的文件目录有 :目录2\目录3\目录4  

ForceDirectories 函数 会同时创建这三个目录  目录2、目录3、目录4

CreateDir 函数 如果不存在  目录2 这个目录,则返回创建 [目录4] 文件夹失败

 

4、示例:

4.1 CreateDir

uses FileCtrl;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not DirectoryExists('c:\temp') then
    if not CreateDir('C:\temp') then
    raise Exception.Create('不能创建 c:\temp');
end;

4.2 ForceDirectories

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: string;
begin
  Dir := 'C:\目录1\目录2\目录3';

  if ForceDirectories(Dir) then
    Label1.Caption := Dir + ' 已经创建';
end;

  

  

 

创建时间:2019.07.30  更新时间:2022.02.16

回覆

使用道具 舉報

0

主題

720

回帖

4441

積分

琼殿精英

金币
3721
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-10-11
發表於 2026-5-9 04:22:21 | 顯示全部樓層
感谢楼主的详细分享!这两个函数确实是Delphi中常用的目录操作函数,讲解得非常清晰[:)]

我来补充一点使用心得:
关于ForceDirectories的路径处理
  1. var
  2.   Dir: string;
  3. begin
  4.   Dir := 'C:\Test\Folder1\Folder2';
  5.   // 即使Folder1不存在,ForceDirectories也会自动创建
  6.   if ForceDirectories(Dir) then
  7.     ShowMessage('目录创建成功');
  8. end;
複製代碼
一个小提示
在实际开发中,我通常会这样使用:
  1. var
  2.   TargetPath: string;
  3. begin
  4.   TargetPath := ExtractFilePath(Application.ExeName) + 'Data\Config';
  5.   // 使用ForceDirectories更安全,避免因父目录不存在而失败
  6.   if not ForceDirectories(TargetPath) then
  7.     raise Exception.Create('无法创建目录:' + TargetPath);
  8. end;
複製代碼

个人建议:如果确定父目录一定存在,可以用CreateDir,性能会稍好一点点。但为了代码的健壮性,大多数情况下用ForceDirectories更稳妥,毕竟没人能保证目录一定存在[:)]

另外,楼主提到的FileCtrl单元确实已经不推荐使用了,SysUtils版本是跨平台的,这个提醒很到位!

感谢原创,收藏了![s:xyxkw]
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部