Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
FreePascal / Lazarus
|
Re: Funktionsoptimierung
30. Nov 2009, 14:13
hmm ...
also bei
and ((aDestDir = INVALID_HANDLE_VALUE)
und
and (ftLastWriteTime > ftLastWriteTimeDest))
hast Du Dich wahrscheinlich vertippt. Böses Copy&Paste
Edit: Ich habe mir aus Deinen Tips folgende Funktion gebaut:
Delphi-Quellcode:
procedure BuildFileList(const aSourceDir, aDestDir: string; aSource, aFiles:
TStringList; const aMaxFileAge: Integer); cdecl;
var
sFileName, sSourceFileName: string;
hSource, hDest: THandle;
rSourceFindData, rDestFindData: TWIN32FindData;
ftCreationTime, ftLastWriteTime, ftLastWriteTimeDest: TFileTime;
sSourceDir: string;
sDestDir: string;
begin
sSourceDir := IncludeTrailingPathDelimiter(aSourceDir);
sDestDir := IncludeTrailingPathDelimiter(aDestDir);
ZeroMemory(@rSourceFindData, SizeOf(TWIN32FindData));
ZeroMemory(@rDestFindData, SizeOf(TWIN32FindData));
aFiles.BeginUpdate;
try
for sFileName in aSource do
begin
sSourceFileName := sSourceDir + sFileName;
hSource := FindFirstFile(PChar(sSourceFileName), rSourceFindData);
Windows.FindClose(hSource);
if (hSource = INVALID_HANDLE_VALUE) or
(rSourceFindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) then
Continue;
hDest := FindFirstFile(PChar(sDestDir + sFileName), rDestFindData);
Windows.FindClose(hDest);
if (hDest = INVALID_HANDLE_VALUE) then
aFiles.Add(sSourceFileName)
else
begin
FileTimeToLocalFileTime(rSourceFindData.ftCreationTime, ftCreationTime);
FileTimeToLocalFileTime(rSourceFindData.ftLastWriteTime, ftLastWriteTime);
FileTimeToLocalFileTime(rDestFindData.ftLastWriteTime, ftLastWriteTimeDest);
if (aMaxFileAge = 0) then
begin
if (FileTimeToDateTime(ftLastWriteTime) > FileTimeToDateTime(ftLastWriteTimeDest)) then
aFiles.Add(sSourceFileName);
end
else
begin
if (DaysBetween(FileTimeToDateTime(ftCreationTime), Date) <= aMaxFileAge)
or (DaysBetween(FileTimeToDateTime(ftLastWriteTime), Date) <= aMaxFileAge) then
aFiles.Add(sSourceFileName);
end;
end;
ZeroMemory(@rSourceFindData, SizeOf(TWIN32FindData));
ZeroMemory(@rDestFindData, SizeOf(TWIN32FindData));
end;
aFiles.Sort;
finally
aFiles.EndUpdate;
end;
end;
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
|
|
Zitat
|