Falsche Berechnung der Datenmenge über Netzwerk



  • Hi,

    ich habe mir ein kleines Programm geschrieben, welches die Datenmenge zusammen rechnet.

    Auf Windows Rechner und NTFS Platten funktioniert dies wunderbar. Doch ich habe ein Netzlaufwerk und die Quelle ist eine Verzeichnisfreigabe auf einem Mac und dabei kommen richtig falsche werde bei raus. Also das Programm schießt da meilenweit über das annähernde Ergebnis hinaus.

    Ich benutze folgende Anweisung zur Berechnung. sr ist ein Objekt von TSearchRec und sl von TStringList, iTotalSize vom Typ __int64.

    HANDLE hFile = 0 ;
    DWORD dwFileSize = 0 ;
    
    AnsiString sFileName = sDirectory + "\\" + sr.Name ;
    
    hFile = CreateFile( sFileName.c_str(), 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ) ;
    dwFileSize = GetFileSize( hFile, NULL ) ;
    CloseHandle(hFile) ;
    
    iTotalSize = StrToInt64(sl->Strings[0]) + dwFileSize ;
    sl->Strings[0] = IntToStr( iTotalSize ) ;
    sl->Add( sDirectory + "\\" + sr.Name ) ;
    

    Hatte es erst mit sr.Size berechnet, doch dies ist ja nur vom Typ int. Und bei Dateien über 4GB gibt es da bekanntermaßen Probleme.

    Vielleicht kennt ja der ein oder andere die Schwachstelle und weiß diese zu behaben.

    Viele Grüße
    Heinz



  • Hallo

    Wenn du so sehr auf 64-Bit Größen achtest, warum benutzt du GetFileSize nur so, das du nur 32-Bit- Werte (DWORD) bekommst? Schau dir die Parameter der Funktion nochmal an.

    Desweiteren finde ich es schlecht, das du bei jeder Datei von String umwandelst, addierst und dann wieder in String umwandelst. Warum nicht eine Schleifenübergreifende int64-Summenvariable?

    /Edit : um es nochmal genauer zu sagen der WinAPI-Typ DWORD ist ein Äquivalent zu int, in 32-Bit-Plattformen also immer 32 Bit. Wenn du 64-Intergers willst, must du __int64 benutzen.

    bis bald
    akari


Anmelden zum Antworten