Einzelnen Beitrag anzeigen

Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Funktionsoptimierung

  Alt 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?
  Mit Zitat antworten Zitat