Autor Beitrag
paranoidray
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 12.05.05 12:18 
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:
ausblenden 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
  {Calculate the CRC32 image for Stream}
  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
  {Create a stream to hold the file specified by FileName}
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  {Attempt to calculate the CRC32 for the stream}
  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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Fr 13.05.05 08:56 
kein wunder das das netzwerk langsamer funktioniert.
um eine checksumme zu erstellen, muss dein programm den gesamten inhalt der datei über das netzwerk laden und die checksumme. da die datenübertragung über das netzwerk wesentlich langsamer ist, als die übertragungsrate der festplatte, dauert es natürlich länger.

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
paranoidray Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 13.05.05 13:52 
Titel: Stimmt leider nicht
Stimmt leider nicht

1. Kann eine CRC32 Checksumme Stückweise errechnet und aufsummiert werden.
Mann braucht nicht die ganze Datei am Stück.
( Wie im Quelltext auch sichtbar ist. )

2. Dauert es die Dateien lokal zu berechnen unter 3 Sekunden
und sie über das Netzwerk zu kopieren 10...
Es sollte also mit meinem Programm um die 13 sekunden dauern... oder ?

Hat da jemand eine Idee ?