Registriert seit: 14. Nov 2005
561 Beiträge
RAD-Studio 2009 Ent
|
Re: Compare Files -> Optimieren
6. Jan 2009, 16:28
Zitat von p80286:
Du verwendest sehr viele write, und die kosten Zeit!
grüße
K-H
Deshalb habe ich den Code jetzt nochmals ein wenig angepasst...
allerdings spare ich nicht allzuviel Zeit ein. Bei meinem vergleich mit ~10'000 und ~2'000 Ordnern war das Programm
jetzt immerhin 2 Sekunden schneller und brauchte aber insgesammt immer noch 6 Sekunden.
Das ist aber immer noch min. 2 Sekunden zu langsam und
Zitat von himitsu:
Insgesamt würde es, von der Programmstruktur und den verwendeten Komponenten her, vermutlich aber eh Probleme mit vielen Dateien geben (war es wohl nicht sonderlich gut, von mir, deinem Programm gleich mal 2 "kleine" Festplatten zum Vergleich zu geben)
Beim 2. Versuch, nur mit meinem USB-Stick und seinem Backup (je 26.506 Dateien und ~2 GB belegt) kommt der selbe Fehler.
dieses Problem ist ja auch noch zu lösen, wobei die Idee ja nicht umbedingt ist zwei Festplatten zu überprüfen, oder braucht das jmd?! wie auch immer -> es dürfte keinen Absturz verursachen...
Delphi-Quellcode:
// ]]] START COMPARING [[[
procedure TFormMain.Compare;
var
i,j,c,tmpIndex,tmpIndex2,ri:Integer;
Dir:String; // Directory Name
arChecked: array of Integer;
arRow: TRowArray;
begin
ClearStringGrid;
SetLength(arFileRec1,0);
SetLength(arFileRec2,0);
SetLength(arChecked,0);
SetLength(arRow,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;
SetLength(arRow,Length(arRow)+1);
arRow[Length(arRow)-1].Name:=Dir;
end;
ri:=Length(arRow);
SetLength(arRow,ri+1);
arRow[ri].Name:=arFileRec1[i].Name;
arRow[ri].Size:=IntToStr(arFileRec1[i].Size);
arRow[ri].Date:=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 arRow[ri].Sign:='>'; end;
fdsOlder: begin arRow[ri].Sign:='<'; end;
fdsSameDate: begin arRow[ri].Sign:='='; end;
end;
arRow[ri].Date2:=DateTimeToStr(arFileRec2[tmpIndex].Date);
arRow[ri].Size2:=IntToStr(arFileRec2[tmpIndex].Size);
arRow[ri].Name2:=arFileRec2[tmpIndex].Name;
end
else
begin
arRow[ri].Sign:='>';
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
arRow[ri].Sign:='<';
arRow[ri].Date2:=DateTimeToStr(arFileRec2[j].Date);
arRow[ri].Size2:=IntToStr(arFileRec2[j].Size);
arRow[ri].Name2:=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;
SetLength(arRow,Length(arRow)+1);
arRow[Length(arRow)-1].Name:=Dir;
end;
ri:=Length(arRow);
SetLength(arRow,ri+1);
arRow[ri].Sign:='<';
arRow[ri].Date2:=DateTimeToStr(arFileRec2[i].Date);
arRow[ri].Size2:=IntToStr(arFileRec2[i].Size);
arRow[ri].Name2:=arFileRec2[i].Name;
Inc(c);
end;
end;
Statusbar1.Panels[0].Text := ' files found: '+IntToStr(c);
BtnCompare.Enabled:=True;
BtnAbort.Enabled:=False;
StringGrid1.RowCount:=Length(arRow);
for i := 1 to Length(arRow) do
begin
StringGrid1.Cells[0,i]:=arRow[i].Name;
StringGrid1.Cells[1,i]:=arRow[i].Size;
StringGrid1.Cells[2,i]:=arRow[i].Date;
StringGrid1.Cells[3,i]:=arRow[i].Sign;
StringGrid1.Cells[4,i]:=arRow[i].Date2;
StringGrid1.Cells[5,i]:=arRow[i].Size2;
StringGrid1.Cells[6,i]:=arRow[i].Name2;
end;
end;
Im Anhang noch das aktualisierte Projekt...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
|