如果新目录已经存在,则从旧目录复制自身到新目录中

Copy dir from old copies itself inside the new dir if it already exists

所以我正在尝试将文件和文件夹从一个目录复制到另一个目录。基本功能有效,它复制所有内容,但如果新文件夹已经存在,那么它将复制新文件夹中的旧文件夹,而不仅仅是内容。

基本上如果文件夹不存在,就会创建它,并将旧文件夹的内容复制到新文件夹中。 但 如果新文件夹已经存在,那么它会将整个文件夹复制到新文件夹中,而不仅仅是内容。

这是您可以尝试的完整示例。

uses
  System.SysUtils,
  Windows,
  ShellApi;

function CopyDir(const fromDir, toDir: string): boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_COPY;
    fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    pFrom := PChar(IncludeTrailingPathDelimiter(fromDir) + #0#0);
    pTo := PChar(IncludeTrailingPathDelimiter(toDir) + #0#0);
  end;
  Result := (0 = ShFileOperation(fos));
end;

var
  dirFrom, dirTo: string;

begin
  try
    dirFrom := 'C:\UserTemp\FolderToCopy';
    dirTo := dirFrom + '_OLD';
    CopyDir(dirFrom, dirTo + '\'); //<-- this creates the folder with right content inside
    CopyDir(dirFrom, dirTo + '\');// <-- this instead of overwriting it will add FolderToCopy inside FolderToCopy_OLD
    writeln('ok');
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
    begin
      writeln(E.ClassName, ': ', E.Message);
      readln;
    end;
  end;

end.

我的预期结果是相同的内容被覆盖。因此,如果我将 "FolderToCopy" 复制到 "FolderToCopy_OLD",我希望在“_old”中找到 "FoldertoCopy" 的内容。相反,当“_old”已经存在时,我所拥有的是 "FolderToCopy_OLD/FolderToCopy".

这是应该的,因为这就是您要求 SHFileOperation() 执行的操作 - 将一个文件夹复制到另一个文件夹中。要仅复制文件夹的 内容 而不是文件夹 本身 ,请将 pFrom 设置为 '<folder>\*' 而不是 '<folder>\':

pFrom := PChar(IncludeTrailingPathDelimiter(fromDir) + '*'#0#0);