Delphi-PRAXiS
Seite 10 von 12   « Erste     8910 1112      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Filedup 1.0.7.0 - Identische Dateien finden (https://www.delphipraxis.net/50137-filedup-1-0-7-0-identische-dateien-finden.html)

himitsu 9. Jan 2007 18:59

Re: Filedup - Identische Dateien finden
 
Also dat versteh ich nicht ganz, :gruebel:
wieso übergibst du die Zeit SetStateTime(Project.CurrentTime);,
wenn du sie eh nicht verwendest?
Delphi-Quellcode:
procedure TStatusForm.SetStateTime(const Seconds: Cardinal);
begin
  TimeLabelContent.Caption := SecondsToHours(Project.CurrentTime);
end;
so wird's wohl gemeint sein.
Delphi-Quellcode:
procedure TStatusForm.SetStateTime(const Seconds: Cardinal);
begin
  TimeLabelContent.Caption := SecondsToHours(Seconds);
end;
Dann ist diese voll mißt, denn es zählt total falsch.
Nach dem oben schon erwähntem Szenario benötigt mein Programm 2,2 Stunden und deines hab ich nach über 2 stunden bei 11% abgebrochen, jedoch hatte es seiner Meinung nach bis dahin nur 1,5 Stunden gebraucht.
Im Extem gingen schonal in nur 30 Sekunden über 10 Sekunden auf deiner Uhr verloren. :shock:

Da OnTime durchschnittlich nicht alle genau einer Sekunde aufgerufen wird (ist bei deinem Programmaufbau garnicht möglich) muß falsch gezählt werden,
da zwar nach spätestens 1 Sekunde durch den Timer der Aufruf von TStatusForm.OnTime veranlaßt wird, aber durch die eher sperrliche Abarbeitung der Nachrichtenliste deiner Anwendung Einiges untergeht und verzerrt wird.
Es wird ja nur wärend Application.ProcessMessages die Nachrichtenliste abgearbeitet

> siehe TimeDemo (Anhang)
Da läuft ein Timer mit 100ms-Intervall.
Als Versuchswerte bieten sich 0, 50, 100 und 500 an:
- 0 und 50: zu vermuten wäre, daß wegen des geringeren Intervalls die Zeit fast genau wäre, dennoch fehlt Einiges.
- 100: hier könnte man auch 'ne Übereinstimmung vermuten, da beide Intervalls gleich sind.
- über 100 (Timer1.Intervall = 100) muß was fehlen, da hier das Intervall zu groß ist und dadurch auf Jedenfall die Nachrichtenverarbeitung verschleppt wird.


Besser du speicherst die Startzeit und rechnest die tatsächlich vergangene Zeit aus.
(GetTickCount + Integer-Cardinal-Konvertierung sollte hoffentlich mit den bis zu 24,86 Tagen ausreichen)
Delphi-Quellcode:
procedure TStatusForm.OnTime(Sender: TObject);
begin
  SetStateTime(GetTickCount - Project.CurrentTime);
end;

procedure TStatusForm.InitStateTime;
begin
  Project.CurrentTime := GetTickCount;
  SetStateTime(GetTickCount - Project.CurrentTime);
end;
Vergiß aber nicht die vergangene Zeit nach Scanende zu speichern (für deine Statistik).



Wenn ich die Laufzeit bei mir so sehe, dann wäre es nett, wenn man zwischen Cached- und NonCached-Dateioperationen auswählen könnte.
Vorallem ist es Schlimm, wenn nachdem (und natürlich auch wärend) dein Programm lief, alles was auf die Festplatte zugreift teilweise minutenlang braucht ... vorallem ganz nett im Explorer anzusehen ... is hier aber auch kein Wunder, denn schließlich braucht es 'ne kleine Weile, bis so 700-800 MB aus der Systemcache abgebaut und aufgeräumt wurden ... zum Glück paßt da bei mir zur Zeit nicht nochmehr rein ^^


Zitat:

Da müsste ich erst im Quelltext blättern, und nen bissle suchen
ich dachte man weiß in etwa, was man verbrockt hat :gruebel:

aber keine Sorge ... ich seh in deinem Quellcode och nicht so ganz durch ... anderer Codestil und total andere (mir unverständliche) Herangehensweise... :angel:




PS:
458.714 - 170 GB
164.051 - 9,45 GB


PSS: http://www.delphipraxis.net/internal...=663073#663073


Und dat Schaf:
ich liebe es ... is ja auch mein Sternzeichen (jap) :zwinker:

http://fnse.de/S05/1O6.gif http://fnse.de/S05/1O7.gif http://fnse.de/S05/1OA.gif http://fnse.de/S05/1OB.gif http://fnse.de/S05/1O8.gif http://fnse.de/S05/1OD.gif http://fnse.de/S05/1O9.gif http://fnse.de/S05/1OC.gif

Bin zwar nicht der Copyrightinhaber davon, allerding sollte es keine rechtlichen Probleme geben.
werd' aber bei Gelegenheit bei Natasja nochmal anfragen.

xZise 9. Jan 2007 21:35

Re: Filedup - Identische Dateien finden
 
Zitat:

Zitat von bigg
Zitat:

Zitat von XZise
Wäre es möglich, dass man das Programm beendet, und nach einen neuen Start "weitersucht"?

Jupp, wäre möglich, dennoch fehlt mir im Moment die Zeit und Lust. Viel wichtiger wäre es, den Suchprozess zu optimieren, dann könnte man sich das gleich sparen.^^

Da wäre ich mir nicht sicher :D Ich habe länger als 2 Stunden gebraucht ;)
Du müsstest also sehr viel raushauen, um da wirklich die Pause zu sparen :D

bigg 9. Jan 2007 22:45

Re: Filedup - Identische Dateien finden
 
Naja, solchen Käse verzapft doch jeder mal... :wink:

Delphi-Quellcode:
  Function SizeToString(Size: LargeInt): String;
    Var i: LargeInt;

    Begin
      i := Abs(Size);
      If i < 1000 Then Result := Format('%.0n B', [Size / 1])
      Else If i < 10235 Then Result := Format('%.2n KB', [Size / 1024])
      Else If i < 102349 Then Result := Format('%.1n KB', [Size / 1024])
      Else If i < 1023488 Then Result := Format('%.0n KB', [Size / 1024])
      Else If i < 10480518 Then Result := Format('%.2n MB', [Size / 1048576])
      Else If i < 104805172 Then Result := Format('%.1n MB', [Size / 1048576])
      Else If i < 1048051712 Then Result := Format('%.0n MB', [Size / 1048576])
      Else If i < 10732049531 Then Result := Format('%.2n GB', [Size / 1073741824])
      Else If i < 107320495309 Then Result := Format('%.1n GB', [Size / 1073741824])
      Else If i < 1073204953088 Then Result := Format('%.0n GB', [Size / 1073741824])
      Else If i < 10989618719622 Then Result := Format('%.2n TB', [Size / 1099511627776])
      Else If i < 109896187196212 Then Result := Format('%.1n TB', [Size / 1099511627776])
      Else If i < 1098961871962112 Then Result := Format('%.0n TB', [Size / 1099511627776])
      Else If i < 11253369568892027 Then Result := Format('%.2n PB', [Size / 1125899906842624])
      Else If i < 112533695688920269 Then Result := Format('%.1n PB', [Size / 1125899906842624])
      Else If i < 1125336956889202688 Then Result := Format('%.0n PB', [Size / 1125899906842624])
      Else Result := Format('%.2n EB', [Size / 1152921504606846976]);
    End;
:shock:

Recht haste aber trotzdem mit dem Counter. War im übrigen bekannt, man muss nur ein paar mal hintereinander 'Pause ' drücken, während "er" rödelt. Das ich allerdings die globale Variable dafür benutze, war nicht geplant. Haste ja rischtisch gesacht und werdsch mal ändern. :wink:

Zitat:

Zitat von himitsu
ich dachte man weiß in etwa, was man verbrockt hat Grübelnd...

aber keine Sorge ... ich seh in deinem Quellcode och nicht so ganz durch ... anderer Codestil und total andere (mir unverständliche) Herangehensweise... Angel

Hab schon schlimmeres gesehen. :mrgreen:
Aber vielleicht kann ich dir ja och noch uff de Sprünge helfen und dir einiges erklären. :stupid:

PS: Wäre schön, wenn der Copyright-Inhaber nichts dagegen hätte.

@XZise: Da geht in jedem Fall noch was. :angel2: Mein Zufallsgenerator muss nur irgendwann den richtigen Code ausk*****.

himitsu 10. Jan 2007 17:34

Re: Filedup - Identische Dateien finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
upps, vergessen die Datei mit hochzuladen :wall:


Zitat:

Zitat von bigg
SizeToString...

:shock:

was dagegen?

Wert immer maximal 3-stellig und dann sind die Werte speziell auf das standardmäßige Rundungsverhalten der FPU abgestimmt.
Und ja, es ist mit Absicht mit IF und nicht über CASE gelöst :angel:


PS: Sheepo ... sie hatte so jedenfalls (soweit ich es noch weiß) nie verboten gahabt, :angel:
's is aber bestimmt auch schon über 1,5 Jahre her, dat ich die Kleinen fand.

bigg 10. Jan 2007 18:19

Re: Filedup - Identische Dateien finden
 
moin moin,

Warum if und case verwenden, wenn es auch iterativ zu lösen ginge?
Nur der Rundung halber? :gruebel:

Delphi-Quellcode:
function FileSizeToString(const FileSize: Int64): String;
const Measure: Array[0..4] of String = ('Byte', 'KB', 'MB', 'GB', 'TB');
var NewSize: Currency;
var i: Integer;
begin
  Result := '';

  if FileSize > -1 then
  begin
    i := 0;
    NewSize := FileSize;

    while (NewSize >= 1024) do
    begin
      NewSize := NewSize / 1024;
      Inc(i);
    end;

    case i of
      0: Result := FloatToStr( NewSize );
      1,
      2,
      3: Result := FormatFloat('0.00', NewSize);
      4: Result := FormatFloat('0.000', NewSize);
    else Result := FloatToStr( NewSize );
    end;

    Result := Result + #32 + Measure[i];
  end;
end;
PS: TimeTest hab ich mir angesehen, werd ich wie gesagt nochmal fixen.
Und @alle die ihre Farben ändern, aber sich wundern, warum im Report andere Farben auftauchen, is so,
nich wundern ;>.

himitsu 10. Jan 2007 18:32

Re: Filedup - Identische Dateien finden
 
meines bekommt keine Rundungsfehler ('s wird ja nirgends was umgerechnet), ist schneller und warum erst in 'ner Schleife mit langsamen Fließkommazahlen rechnen, wenn doch einfache Integervergleiche ausreichen :zwinker:

und deines zeigt doch bestimmt 1010 Byte als 1010 Byte an ... meines als 0,99 KB ... wie gesagt, ich wollte genau 3 Stellig haben und nicht nur meistens, oder so in etwa... :roll:

schau dir doch mal die Integer-Vergleichswerte an ... es hat 'nen Grund, dat die krum und bucklig sind (z.B. 10235 statt 10240) :mrgreen:

bigg 10. Jan 2007 18:54

Re: Filedup - Identische Dateien finden
 
[ot]
Schau dir doch mal an, was der Windows Explorer (Datei->Eigenschaften) bei 1010 Byte anzeigt. :stupid:
Das der Datentyp Currency nur 4 Nachkommastellen aufnimmt, ist für diese Berechnung auch nicht weiter schlimm, schließlich zeige ich auch nur maximal 3 Stellen hinter dem Komma an.

Wie och immer...so hat jeder seine eigene Logik...
PS: Und ganz Explorer-Like arbeitet meine Funktion nicht...woltsch nur anmerken :warn:
[/ot]

bigg 19. Jan 2007 01:37

Re: Filedup - Identische Dateien finden
 
moin moin,

eine neue Version ist oben und darf getestet werden.

1.0.5.0
- Optimierung der Suche
- Dauer der Suche wurde falsch berechnet
- Stop bricht nun sofort einen Suchvorgang ab
- Breiten aller Spalten (Dateiliste) werden nun gesichert
- Sortierung der Spalten 'Name', 'Verzeichnis' und 'Typ' arbeiteten nicht korrekt
- eine Zusammenfassung eines Suchlaufs kann nun in die Zwischenablage kopiert werden

xZise 21. Jan 2007 11:04

Re: Filedup - Identische Dateien finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zu euren Größenpräfixen:
Sie brauchen für eine Berechnung von 100.000 mal ungefähr 62 ms ;) Also ist es eigentlich egal, was ihr verwendet.
(Dateigröße: 123456 Byte)

Zusätzlich habe ich noch die "Thousands"-Methode entwickelt, welche zuerst ausrechnet, welche Tausenderpotenz es hat, und das dann als Potenz nimmt zur Berechnung.
Dummerweise ist es nicht schneller :( Ganz im Gegenteil... ~ 125 ms für 100.000 Berechnungen.

PS: Ich rechne mit "GetThreadTimes"

bigg 21. Jan 2007 11:32

Re: Filedup - Identische Dateien finden
 
moin moin,

@XZise: Beide Funktionen sind schnell genug, um die Aufgabe zu lösen. Sie werden hauptsächlich beim Zeichnen des Grids verwendet, im Endeffekt also keine 1000 aufgerufen pro Zeichnung. Somit dürfte der Zeitunterschied = 0 betragen. Darum ging es aber auch gar nicht, es ging um Programmier-Stil.

Gruss bigg


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Seite 10 von 12   « Erste     8910 1112      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz