我注意到似乎存在内存泄漏影响我的代码,该代码只是复制目录树结构,这是自 Windows XP 以来一直在使用的一些代码,并且没有更改,并且以前没有表现出这种泄漏特征。
我在网上看到其他人提到过它,并将其归因于去年发送的更新中的一个错误,该错误影响了 NTDLL.DLL 中的某些功能。
所以我的Delphi代码很简单
function copyFiles(srcDirectory,dstDirectory:string;indent:string):boolean;
var
searchRec : TSearchRec;
searchResult : integer;
srcName : string;
dstName : string;
srName : string;
begin
result:=true;
srcDirectory:=includeTrailingPathDelimiter(srcDirectory);
dstDirectory:=includeTrailingPathDelimiter(dstDirectory);
createDirectoryTree(dstDirectory);
searchResult:=findFirst(srcDirectory+'*.*',faAnyFile,searchRec);
try
while (searchResult=0) do
begin
if ((searchRec.attr and faDirectory)=faDirectory) then
begin
if (searchRec.name<>'.') and (searchRec.name<>'..') then
begin
if not copyFiles(srcDirectory+searchRec.Name,dstDirectory+searchRec.Name,indent) then
begin
result:=false;
end;
end;
end
else
begin
if (
((searchRec.attr and faReadOnly)=0) and
((searchRec.attr and faVolumeID)=0) and
((searchRec.attr and faSysFile)=0) and
((searchRec.attr and faHidden)=0)
) then
begin
srcName:=srcDirectory+searchRec.name;
dstName:=dstDirectory+searchRec.name;
clearReadOnly(srcName);
clearReadOnly(dstName);
if not copyFile(PChar(srcName),PChar(dstName),false) then
begin
logFmt('%sCopy %s to %s, failed',[indent,srcName,dstName],true);
result:=false;
end
else
begin
logFmt('%sCopy %s to %s, success',[indent,srcName,dstName]);
end;
end;
end;
searchResult:=findNext(searchRec);
end;
finally
try
System.sysUtils.findClose(searchRec);
except
end;
end;
end;
我很想听听自去年 3 月份更新到 Windows 10 以来遇到过 CopyFile 方法此问题的其他人的意见。
我还尝试使用 FindAllFiles 方法获取文件列表,然后复制并获得相同的效果,常见的是对 CopyFile 的调用,所以我相信这是我的问题的根源。