如何在Delphi中递归地创建文件夹?

21

需要创建一个函数,可以按给定路径递归地创建文件夹:

C:\TestFolder\Another\AndAnother

Delphi函数MkDir返回IO错误码=3。

MkDir('C:\TestFolder\Another\AndAnother');
2个回答

71
使用
ForceDirectories('C:\TestFolder\Another\AndAnother');

这是一个标准的RTL函数,可以在SysUtils.pas中找到。因此,即使创建自己的函数也不必要,尽管那并不难。


5
编写适用于自己计算机的“ForceDirectories”函数:易如反掌。编写一个可以在复杂环境下处理所有边缘情况的函数:非常困难 - Ian Boyd
所有的边缘情况都使其变得困难。 - rocksteady
1
这不是UNC感知的,这就是为什么我推荐使用新的IOUtils库。 - Gabriel

3

SysUtils现在已过时,而ForceDirectories不支持UNC!

自Delphi XE7(甚至更早)以来,出现了一个名为IOUtils的新库。
IOUtils具有跨平台兼容性和UNC感知功能。

function ForceDirectories(FullPath: string): Boolean;   // Works with UNC paths
begin
  TDirectory.CreateDirectory(FullPath);
  Result:= DirectoryExists(FullPath);
end;

注意:此函数来自Delphi LightSaber库。 那里还有其他几个类似的I/O函数(例如ListFilesOf(Folder))。

如果我们要使用System.IOUtils,难道我们不应该至少使用TDirectory.Exists而不是来自SysUtils的DirectoryExists吗? - undefined
你是对的,但只是为了使用现代代码而已。DirectoryExists仍然有效(并且Emba也没有将其标记为已弃用)。 附注:代码看起来是这样的,因为它是我LightSaber库中非常非常古老的一部分。这是那个库中最早的一些代码之一。当时,IOUtils非常糟糕。我的意思是严重有缺陷。所以,我尽量少使用IOUtils。 - undefined
1
无论如何,TDirectory.Exists仍然没有解决DirectoryExists存在的一些问题: https://stackoverflow.com/questions/15166420/delphi-directoryexists-function-odd-behaviour-for-network-mapped-units - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接