Ich habe meinen Code von TsearchRec auf die Win-API umgeschrieben, damit er schneller ist:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| procedure TSuchThread.ScanDir(Ordner:TOrdner;const Directory: string);
function BackupDir(const s:String): Boolean; begin If(BackupPathLength <= Length(s)) then Result := CompareMem(PChar(s),PChar(BackupPath),BackupPathLength) else Result:=false; end;
var tmp:TOrdner; itmp:Cardinal; iSize,iDate:Int64; hFindFile:THandle; wfd:TWin32FindData; begin If(not Terminated) then begin ZeroMemory(@wfd, sizeof(wfd)); wfd.dwFileAttributes := FILE_ATTRIBUTE_NORMAL; hFindFile := FindFirstFile(pointer(Directory + '*.*'), wfd); if hFindFile <> 0 then try repeat If ((wfd.dwFileAttributes and faDirectory) = faDirectory) then begin if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..') then If(FSubDir) and (not BackupDir(wfd.cFileName)) then begin tmp:=TOrdner.Create(wfd.cFileName,Ordner); ScanDir(tmp,Directory + wfd.cFileName + '\'); Inc(FiOrdner); end; end else begin iSize := wfd.nFileSizeLow; PCardinal(Cardinal(@iSize) + SizeOf(Cardinal))^ := wfd.nFileSizeHigh; iDate := wfd.ftLastWriteTime.dwLowDateTime; PCardinal(Cardinal(@iDate) + SizeOf(Cardinal))^ := wfd.ftLastWriteTime.dwHighDateTime; Ordner.Dateien.Add(wfd.cFileName,iSize,iDate); Inc(FiDateien); end; until FindNextFile(hFindFile, wfd) = False; finally Windows.FindClose(hFindFile); end; Ordner.Dateien.Sort(true); Ordner.Ordner.Sort(@CompareOrdner); itmp:=GetTickCount; if(GetTickDiff(FTime,itmp)>80) then begin Synchronize(SyncStatus); FTime:=itmp; end; end; end; |
2 Fragen:
1) Habe ich dabei was übersehn zu ändern?
2) Sieht jemand noch weitere Optimierungsmöglichkeiten (Ist schon sehr schnell =) )