Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.335 Beiträge
 
Delphi 12 Athens
 
#88

Re: Pegasus: Luckies persönliches Synchronisationstool

  Alt 29. Aug 2006, 11:49
Moin Luckie ^^


erstmal hab ich ein Problem festgestellt, kann aber einfach nicht sagen woher es kommt o.O

und zwar, wenn ich meinen USB-Sick mit einem Verzeichnis auf der Platte synchronisiere, dann läuft erstmal das Erstellen der Dateilist normal ab, auch das Syncronisieren läuft ohne (scheinbar) Probleme durch,
nur wenn dich danach nochmal eine Dateiliste erstelle werden plötzlich wieder Unterschiede gefunden, obwohl doch nach dem Syncronisieren keine mehr vorhanden sein sollten.

Es gab auch keine Fehlermeldung, daß bestimmte Dateien nicht kopiert werden konnten, oder dergleichen.

Auch weiß ich nicht, oder die Dateien beim ersten Durchgang schon in der Dateiliste enthalten waren, oder ob sie schon dort übersehen wurden.


Ist bisher auch nur 2-mal aufgefallen und beim ersten Mal war's erst nach dem 3. Durchlauf alles synchron.
Beim 2. Mal hatte ich wenigstens mit 'nem eigenem (alten) Programm nochmal verglichen und die Unterschiede waren (nach dem 1. Durchlauf) wirklich noch da.

Konnte dieses aber im Debugger bisher noch nicht reproduzieren -.-''

Ach ja:
1 GB USB-Stick
im Durchschnit 500-900 MB mit 17.000-18.000 Dateien



Dann reagiert dein Programm manchmal nicht mehr ... vorwiegend, wenn man auf Abbrechen geklickt hatte und dann eine Weile was anderes machte (also der Pegasus im Hintergrund lag),
danach war dann die ganze Form komplett Weiß und er konnte nur noch über den taskmanager beendet werden.
(wobei dieses auch an meinem Windows liegen könnte ... ist ja etwas lediert, wie man an meinem Problemchen mit EM_SETCUEBANNER sieht -.-'' )




Nun noch ein kleiner Tipp bezüglich der Windows-Cache:
Du ließt die Dateien ja rückwärts ein, demnach würde ich FILE_FLAG_RANDOM_ACCESS bei CreateFile empfehlen.



Und ich weiß ja nicht wieviel du am Pegasus noch ändern willst, aber bei meiner Dateianzahl rechnet der schon echt lange beim Filtern/Anzeigen der Dateiliste (nach dem Suchen/Hashen der Dateien), vorallem wenn sich mal viel verändert hatte.
Ich denk mal ein Großteil dieser Zeit (anzeigen / ListBox füllen) könnte man verhindern, indem die Dateiinfos nich noch ein zweites Mal ausgelesen werden würden. (eventuell gleich bei der Dateisuche mit speichern? ... [size=2]GetFileSize und FileAge ruft ja für jede Datei einzeln nochmals FindFirstFile auf ... GetFileSize ruft FileExists, welches nochmals FileAge aufruft, womit dann pro Datei 3-mal FindFirstFile + die paar mal bei der Dateisuche aufgerufen wird ... dauert halt etwas, wenn die WindowsCache sich dann jedesmal nochmals auf dem langsamen USB-Stick vergewissert, daß sie noch aktuell ist[/size])
Zumindest ein FileExists/FileAge/FindFirstFile kann man leicht einsparren :mrgreen;
Code:
////////////////////////////////////////////////////////////////////////////////
// Procedure : GetFileSize
// Comment  : Returns the filesize

function GetFileSize(szFile: PChar): Int64;
var
  fFile                 : THandle;
  wfd                   : TWIN32FINDDATA;
begin
  result := 0;
  [color=darkred][s]if not FileExists(szFile) then exit;[/s][/color]
  fFile := FindFirstfile(pchar(szFile), wfd);
  if fFile = INVALID_HANDLE_VALUE then exit;
  [color=red]if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then[/color]
    result := ([color=blue]Int64(wfd.nFileSizeHigh) shl 32[/color]) or wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat