如何复制文件夹并保持其结构?



我正在创建一个复制文件夹并将其粘贴为另一个名称的函数。

因此,我有我的"Main"文件夹,根据查询,我将文件夹复制如下:"Main 1", "Main 2", "Main 3">

我设法解决这个问题的方法是通过这个函数:

function TDMMonitor.CopyFolder(Origin, Destination : String) : Boolean;
var
aFiles : TStringDynArray;
InFile, OutFile: string;
Begin
aFiles := TDirectory.GetFiles(Origin, '*.*',  TSearchOption.soAllDirectories);
for InFile in aFiles do
Begin
OutFile := TPath.Combine(Destination , TPath.GetFileName(InFile));
TFile.Copy(InFile, OutFile, True);
End;
Result := True;
End;

这工作!但是我现在的问题是父文件夹有子文件夹没有被正确复制。

我在下面留下了一个更直观的函数结果示例:

主要,";文件夹:

  • File.txt
  • 子文件夹→File3.txt

,主要1";文件夹:

  • File.txt
  • File3.txt

如何维护主文件夹遵循的文件夹结构?

TDirectory。复制作品:

TDirectory.Copy('D:PathMain', 'D:PathMain 1');

TDirectory.GetFiles()返回找到的每个文件的绝对路径数组。soAllDirectories标志告诉它递归地搜索子文件夹。因此,你最终会得到一个可能不同级别的路径数组。

TPath.GetFileName()去掉所有文件夹路径信息,只留下文件名。

根据您的示例,您正在递归地搜索C:Main,并且希望将所有内容复制到C:Main 1。当搜索给您文件C:MainSub-FolderFile3.txt时,您使用TPath.GetFileName()时会丢弃C:MainSub-Folder,因此您将C:Main 1File3.txt连接起来,因此您将C:MainSub-FolderFile3.txt复制到C:Main 1File3.txt而不是C:Main 1Sub-FolderFile3.txt

这就是你的子文件夹不能正确复制的原因。

不使用TPath.GetFileName(),您只需要用Destination路径(C:Main 1)替换每个返回的绝对路径(C:Main)的Origin部分,使路径中的其他所有内容保持完整。这样,C:MainSub-FolderFile3.txt就变成了C:Main 1Sub-FolderFile3.txt

否则,根本不要使用soAllDirectories。使用TDirectory.GetDirectories()手动递归遍历子文件夹,这样每次只处理一级文件夹。

最新更新