Delphi Win32 CreateDirectory在长路径中有多个文件夹时失败

Delphi Win32 CreateDirectory在长路径中有多个文件夹时失败,delphi,create-directory,Delphi,Create Directory,环境是Windows7Pro和Delphi7 Windows.CreateDirectory()无法在路径长度限制下的很长路径中创建多个文件夹GetLastError()返回ERROR\u PATH\u NOT\u FOUND ESXi虚拟机以及本机Win7工作站和物理磁盘上的故障相同。类似的故障发生在Windows.MoveFile()上 下面代码中的长路径在CMD窗口中正确创建,作为粘贴到MKDIR的参数 我的工作就是制作这道长长的便餐。我将“\”字符处的路径拆分为字符串数组。然后我循环遍历

环境是Windows7Pro和Delphi7

Windows.CreateDirectory()
无法在路径长度限制下的很长路径中创建多个文件夹
GetLastError()
返回
ERROR\u PATH\u NOT\u FOUND

ESXi虚拟机以及本机Win7工作站和物理磁盘上的故障相同。类似的故障发生在
Windows.MoveFile()

下面代码中的长路径在CMD窗口中正确创建,作为粘贴到
MKDIR
的参数

我的工作就是制作这道长长的便餐。我将“\”字符处的路径拆分为字符串数组。然后我循环遍历数组,并从每个元素构建累积路径。循环正确地构建完整路径,没有错误

我不知道为什么Win32函数无法创建有效的长路径

var
到达路径:TStringArray;
开始
// --------------
//失败方法
// --------------
strdspath:=“C:\Duplicate Files\my customer recovered data\desktop\my customer name\application data\gtek\gtupdate\aupdate\channels\ch_u3\html\images\”;
如果(Windows.CreateDirectory(pchar(strdspath),nil)=false),那么
结果:=Windows.GetLastError;//#3是返回的
如果(DirectoryExists(strNewPath)=false),则
结果:=未找到错误路径;
// -----------------
//成功的方法
// -----------------
strNewPath:='';
LibSplitToArray(arrDstPath,'\',strDstPath);
对于intIdx:=0到高(arrDstPath)do
开始
strNewPath:=strNewPath+arrDstPath[intIdx]+'\';
CreateDirectory(PChar(strNewPath),nil);
结束;
如果(DirectoryExists(strdspath)=false),则//与原始路径字符串进行比较
开始
结果:=未找到错误路径;
出口
结束;

实际上,函数的官方文档描述了正在发生的事情。由于函数失败,您的直觉应该是查看描述返回值的部分,该部分说明:

错误\u已经存在

指定的目录已存在

找不到错误路径

一个或多个中间目录不存在;此函数仅在路径中创建最终目录

我假设您得到了
错误\u路径\u未找到
,文档表明了一个可能的原因:您试图同时创建多个级别的子目录,而函数不支持这些子目录

幸运的是,DelphiRTL具有递归创建子目录的功能。()


在Delphi2010及更高版本中,还可以使用from
IOUtils.pas
。在内部,这将调用
ForceDirectories

实际上,函数的官方文档描述了正在发生的事情。由于函数失败,您的直觉应该是查看描述返回值的部分,该部分说明:

错误\u已经存在

指定的目录已存在

找不到错误路径

一个或多个中间目录不存在;此函数仅在路径中创建最终目录

我假设您得到了
错误\u路径\u未找到
,文档表明了一个可能的原因:您试图同时创建多个级别的子目录,而函数不支持这些子目录

幸运的是,DelphiRTL具有递归创建子目录的功能。()


在Delphi2010及更高版本中,还可以使用from
IOUtils.pas
。在内部,这调用了
ForceDirectories

只是一个离题提示:如果DirectoryExists(mydir)=False then,您可以编写
如果DirectoryExists(mydir)then
。大多数人觉得这更容易阅读。它之所以被称为
CreateDirectory
,是有原因的,而不是
CreatePath
:它只创建一个目录,而不是几个。只是一个主题外的提示:如果DirectoryExists(mydir)=False,那么
,你可以编写
如果DirectoryExists(mydir),那么
。大多数人认为这更容易阅读。之所以称为
CreateDirectory
,是有原因的,而不是
CreatePath
:它只创建一个目录,而不是几个目录。请注意,Win32 Shell API具有
SHCreateDirectory/Ex()
函数,可以为您创建缺少的中间文件夹,类似于
ForceDirectories()
。区别在于,
ForceDirectories()
在一个(非递归)循环中调用
CreateDirectory()
,而
SHCreateDirectory/Ex()
是一个单独的调用,我非常清楚如何使用Delphi 7,而不是Delphi 10。我写长手记法是因为我不在乎“如果不是”的清晰度。。。构造。让我陷入循环的是CreateDirectory()函数无法创建深度路径,就像命令shell中的MKDIR函数一样。ForceDirectory函数存在于D7中,但在我的CreateDirectory文档中没有提到。我的Win32 SDK文档中有CreateDirectoryEx,但没有提到在单个调用中创建深度路径。因为我是阅读代码的人,所以我按照自己喜欢的方式编写代码。感谢所有人指出了此调用在深层路径上失败的根本原因。这是我将要添加到函数调用gotchas列表中的另一个gotcha…@BruceGavin:我知道你在使用delphi7;我之所以提到Delphi2010的
TDirectory.CreateDirectory
,是为了让本Q的其他读者受益,他们在谷歌搜索过同样的问题!堆栈溢出的一半是为了帮助谷歌我非常不想冒犯你,也不想让你难过。如果我这样做了,我很抱歉。
CreateDirectory
文档没有提到
forcedirectory
的原因是
CreateDirectory