Registriert seit: 14. Nov 2005
561 Beiträge
RAD-Studio 2009 Ent
|
Re: Compare Files -> Optimieren
1. Jan 2009, 23: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!?
|