Dateien >4gb Sicher Kopieren



  • Hi..

    Ich hab grad das problem gehabt große dateien (eine davon 43gb groß)
    von einer festplatte zur anderen kopieren zu müssen. Ich hab zur sicherheit eine md5 checksum drüberlaufen lassen, jedoch waren die checksums auch nach mehreren versuchen unterschiedlich.
    Ein copy /V bringt auch nix da der algorithmus einfach unpassend ist.
    Also machte ich mich daran selbst ein C++ programm zu schreiben das ein file block für block kopiert und für jeden block die checksum prüft und falls nötig nochmal kopiert.
    Jedoch ist der normale filezugriff nicht so gut für dateien >4gb geeignet.
    Zb:

    struct stat inputfilemetadata;
    if (stat(argv[1], &inputfilemetadata) != 0) {
    printf("File information of file %s could not be read\n",argv[1]);
    return 1;
    }
    printf("Size of file %s: %u\n", argv[1], inputfilemetadata.st_size);

    würde die größe von dateien mit mehr als 4gb nicht richtig angeben.

    Gibt es andere libraries die files >4gb supporten?
    Wenn ja (und die MUSS es geben) dann wäre ein beispiel ganz nett
    (z.b. vorschlag: ein file binär einlesen und abschnittsweise immer die position im file anzeigen)

    Danke im Vorraus,
    Morke



  • Benutz WinAPI.



  • Kopier sie mit Linux, da gibts keine Probleme.
    Knoppix zb.



  • Gast996611 schrieb:

    Kopier sie mit Linux, da gibts keine Probleme.
    Knoppix zb.

    das hat ihm sicher geholfen-.-



  • WinAPI schrieb:

    Benutz WinAPI.

    ReadFile(), WriteFile() schaffen 2^32-1 bytes pro aufruf. musste hat wiederholt aufrufen.

    Gast996611 schrieb:

    Kopier sie mit Linux, da gibts keine Probleme.

    löööööl 😡



  • otze schrieb:

    Gast996611 schrieb:

    Kopier sie mit Linux, da gibts keine Probleme.
    Knoppix zb.

    das hat ihm sicher geholfen-.-

    Das ist gar nicht mal so abwegisch. Schliesslich hat der OP offentsichtlich nicht
    von anfang an vor gehabt, sich ein C++ Programm dafuer zu schreiben. Und da Linux
    zur Dateiverwaltung 63-Bit verwendet, kann es locker Dateien mit 43GByte kopieren.

    ABER: Linux hat das schreiben auf NTFS-Dateisysteme immer noch im experimentellen
    Zustand. D. h. wenn der OP auf ein solches Dateisystem die Datei kopieren will,
    dann sollte er Linux hier besser nicht benutzen (und auch kein Unix).

    ReadFile(), WriteFile() schaffen 2^32-1 bytes pro aufruf. musste hat wiederholt aufrufen.
    

    Wie sieht es mit dem Dateizeiger aus? Ist der in der Lage im File entsprechend
    Hoch positioniert zu werden? Wenn nicht, dann bringen ihm diese Funktionen
    ja nichts.

    Ich kenne die Funktionen nicht, deshalb frage ich. Ich kann mir aber irgendwie
    auch nicht vorstellen, dass man unter Windows solche Dateien nicht kopieren
    kann. Windows ist ja auch nicht mehr von gestern.

    mfg
    v R



  • SetFilePointer nimmt einen 64 Bit-Wert.



  • Ringding schrieb:

    SetFilePointer nimmt einen 64 Bit-Wert.

    Gut, damit sollte sich das Problem dann geloest haben, denke ich 🙂

    mfg
    v R



  • virtuell Realisticer schrieb:

    ABER: Linux hat das schreiben auf NTFS-Dateisysteme immer noch im experimentellen
    Zustand. D. h. wenn der OP auf ein solches Dateisystem die Datei kopieren will,
    dann sollte er Linux hier besser nicht benutzen...

    mit dem 'captive ntfs' könnt's gehen. der verwendet den original windoof treiber (ntfs.sys)



  • Hi,

    Also selbst std::fstream sollte eigentlich mit 64 Bit Positionsangaben zurecht kommen. -> std::fstream::pos_type

    Ihr könnt hier mit testen ob das bei euch auch so ist:

    #include <iostream>
    #include <fstream>
    
    int main(int argc, char *argv[])
    {
      std::cout << sizeof( std::fstream::pos_type ) << std::endl;
      return 0;
    }
    

    Ich benutze den MinGW Compiler mit der gcc Version 3.3.1 auf WinXP Prof.

    Und bei mir erhalte ich als ergebniss: 8

    Da sizeof() ja die Größe der Bytes zurück gibt heißt das es sich um einen
    64 Bit Typ handelt ( 8 * 8 = 64 )

    Und damit wäre es möglich diese Aufgabe auch mit ISO/Ansi C++ zu lösen.

    MfG




Anmelden zum Antworten