Einzelnen Beitrag anzeigen

Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: Compare Files -> Optimieren

  Alt 1. Jan 2009, 22:26
Anscheinend liegen einige Missverständtnisse vor...

Ich will in erster Linie die Dateien zweier nahezu identischen Ordnern auf ihre Aktualität überprufen. Und das übers Datum und nicht über den Inhalt der Dateien...

Das ganze habe ich auch bereits realisiert, nur scheint mir meine Methodik nicht optimal da es offensichtlich auch schneller geht...

Werft doch einfach mal einen Blick auf den Code...

Delphi-Quellcode:
...

// ]]] START COMPARING [[[
procedure TFormMain.Compare;
var
  i,j,c,tmpIndex,tmpIndex2:Integer;
  Dir:String; // Directory Name
  arChecked: array of Integer;
begin

  ClearStringGrid;
  SetLength(arFileRec1,0);
  SetLength(arFileRec2,0);
  SetLength(arChecked,0);
  Dir:='';
  c:=0; // files count
  abort:=false;

  GetTreeList(DirectoryListBox1.Directory, DirectoryListBox1.Directory, '*', CbSubDirs.Checked, True, arFileRec1);
  GetTreeList(DirectoryListBox2.Directory, DirectoryListBox2.Directory, '*', CbSubDirs.Checked, False, arFileRec2);

  for i := low(arFileRec1) to high(arFileRec1) - 1 do
  begin

// Application.ProcessMessages;
// if abort then
// exit;

    if (Dir <> arFileRec1[i].Dir) then
    begin
      Dir:=arFileRec1[i].Dir;
      Write(0,Dir,True);
    end;
    Write(0,arFileRec1[i].Name,True);
    Write(1,IntToStr(arFileRec1[i].Size));
    Write(2,DateTimeToStr(arFileRec1[i].Date));
    tmpIndex:=ArFileRecIndexOfDirName(arFileRec2,arFileRec1[i].DirName);
    Inc(c);
    if (tmpIndex <> -1) then
    begin
      // remember the values already checked ...
      SetLength(arChecked,Length(arChecked)+1);
      arChecked[Length(arChecked)-1]:=tmpIndex;
      // at least compare date values ...
      case CompareDate(arFileRec1[i].Date,arFileRec2[tmpIndex].Date) of
        fdsNewer: begin Write(3,'>'); end;
        fdsOlder: begin Write(3,'<'); end;
        fdsSameDate: begin Write(3, '=') end;
      end;
      Write(4,DateTimeToStr(arFileRec2[tmpIndex].Date));
      Write(5,IntToStr(arFileRec2[tmpIndex].Size));
      Write(6,arFileRec2[tmpIndex].Name);
    end
    else
    begin
      Write(3,'>');
      tmpIndex2:=arFileRecIndexOfDir(arFileRec2,arFileRec1[i].Dir,0);
      if tmpIndex2 <> -1 then
      begin
        for j := tmpIndex2 to high(arFileRec2) - 1 do
        begin
          if not IntArray_Contains(arChecked,j) then
          begin
            if arFileRecIndexOfDir(arFileRec2,arFileRec1[i].Dir,j) <> -1 then
            begin
              if (arFileRecIndexOfDirName(arFileRec1,arFileRec2[j].DirName) = -1)
                and (arFileRec1[i].Dir = arFileRec2[j].Dir) then
              begin
                Write(3,'<',True);
                Write(4,DateTimeToStr(arFileRec2[j].Date));
                Write(5,IntToStr(arFileRec2[j].Size));
                Write(6,arFileRec2[j].Name);
                // remember the values already checked ...
                SetLength(arChecked,Length(arChecked)+1);
                arChecked[Length(arChecked)-1]:=j;
                Inc(c);
              end
            end
            else
              break;
          end;
        end;
      end;
    end;
  end;

  Dir:='';

  // maby there exists folders unique on the right ...
  for i := low(arFileRec2) to high(arFileRec2) - 1 do
  begin

// Application.ProcessMessages;
// if abort then
// exit;

    if not IntArray_Contains(arChecked,i) then
    begin
      if (Dir <> arFileRec2[i].Dir) then
      begin
        Dir:=arFileRec2[i].Dir;
        Write(0,Dir,True);
      end;
      Write(3,'<',True);
      Write(4,DateTimeToStr(arFileRec2[i].Date));
      Write(5,IntToStr(arFileRec2[i].Size));
      Write(6,arFileRec2[i].Name);
      Inc(c);
    end;
  end;

  Statusbar1.Panels[0].Text := ' files found: '+IntToStr(c);
  BtnCompare.Enabled:=True;
  BtnAbort.Enabled:=False;

end;

...
Das ganze Projekt ist wie gesagt im ersten Beitrag gepostet...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat