如果新目录已经存在,则从旧目录复制自身到新目录中
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);
所以我正在尝试将文件和文件夹从一个目录复制到另一个目录。基本功能有效,它复制所有内容,但如果新文件夹已经存在,那么它将复制新文件夹中的旧文件夹,而不仅仅是内容。
基本上如果文件夹不存在,就会创建它,并将旧文件夹的内容复制到新文件夹中。 但 如果新文件夹已经存在,那么它会将整个文件夹复制到新文件夹中,而不仅仅是内容。
这是您可以尝试的完整示例。
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);