Hallo Forenteilnehmer,
ich habe ein seltsames Problem
mit einem Dateivergleicher Projekt.
Um zu sehen ob zwei Dateien gleich sind
vergleiche ich die CRC32 Checksumme.
Das klappt auf Festplatte super:
140 Dateien zusammen ca. 140 MB unter 3 Sekunden.
Im Netzwerk, also auf die gleichen Dateien aus einer Windowsfreigabe,
dauert es aber auf einmal 170 Sekunden...
Ich hab schon probiert den byte Puffer zu erhöhen
und zu verkleinern... Leider ohne Erfolg.
Wenn ich die Dateien auf meine Platte kopiere dauert
es nur 10 Sekunden.
Das dürften dann ja all so zusammen
nur 13 Sekunden dauern die CRC32 Summe auf
die Netzwerkdateien zu berechnen...
Was ist da los, ich brauche das dringend funktionsfähig im
Netzwerk !!!
Source des laders:
Delphi-Quelltext
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:
| function CalculateCRCFromStream(var Stream: TFileStream): Longword; var Buffer: array[1..8192] of Byte; I, ReadCount: Integer; TempResult: Longword; begin TempResult := $FFFFFFFF; while (Stream.Position <> Stream.Size) do begin ReadCount := Stream.Read(Buffer, SizeOf(Buffer)); for I := 1 to ReadCount do TempResult := ((TempResult shr 8) and $FFFFFF) xor ValueTable[(TempResult xor Longword(Buffer[I])) and $FF]; end; Result := not TempResult; end;
function CalculateCRC(FileName: string): Longword; var Stream: TFileStream; begin Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Result := CalculateCRCFromStream(Stream); finally Stream.Free; end; end; |
Ich habe auch schon verschiedene CRC32 Codecs versucht, die sind
zwar alle ein wenig verschieden, aber im Netzwerk genauso schlecht...
Also nehme ich an, es liegt an dem besseren Windows Kopier code,
kann man den in Delhpi nicht doch irgendwie nachcoden oder
kann man den per shell API irgendwie benutzen, so zB als TSream
oder um Dateien block weise mit der Windows Copy Funktion
in einen Temp Ordner zu kopieren und
dann für jeden Block die crc32 summe zu errechnen...
Teilweise sind Dateien ja 100 MB und mehr und die erst in ganz
zu kopieren und dann mit crc32 zu berechnen ist auch keine tolle Lösung !
Für jeden Rat bin ich Dankbar...
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.