我正在创建一个复制文件夹并将其粘贴为另一个名称的函数。
因此,我有我的"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 1
与File3.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()
手动递归遍历子文件夹,这样每次只处理一级文件夹。