Dateien über 700 MB kopieren ?
-
Ich verwende zum kopieren folgende Funktion:
int fcopy(const char *from_name, const char *to_name) { FILE *from, *to; char buf[1024]; /* wir schreiben Kilobyteweise */ double len; if((from = fopen(from_name, "r")) == NULL) return -1; if((to = fopen(to_name, "w")) == NULL) { fclose(from); return -1; } while(!feof(from)) { len = fread(buf, sizeof(char), 1024, from); AfxMessageBox(len/1024); if((len <= 0 && !feof(from)) || fwrite(buf, sizeof(char), len, to) <= 0) { /* Fehler */ fclose(from); fclose(to); return -1; } } fclose(from); fclose(to); return 0; }
Wenn ich damit aber ne Datei kopiere die sagen wir 700 MB hat häght sich das Programm und der explorer auf !
Kann mir jemand sagen woran das liegt ? und was ich verbessern muß ?
-
die Funktion "feof" gibt einen Wert <> 0 zurück, wenn Du versuchst über das Dateiende hinaus zu lesen, Du testest jedoch auf 0!
dieser Wert <> 0 wird jedoch nur einmal!! zurück gegeben, dass heißt beim nächsten Test (in der while-Schleife ist er wieder 0, dass heißt also die Bedingung ist true) daher wird die Schleife nochmal durchlaufen.dann ist der erste Teil der if-Bedingung false und Du versuchst aus einem uninitialisierten Puffer, buf, eine unbekannte anzahl von Zeichen, len, zu lesen und in eine Datei zu schreiben.
das sollte so lange andauern, bis fwrite <= 0 zurück liefert.
denn dann sind beide Bedingungen in der if-Bedingung false.nur theoretisch, kann sein, dass ich etwas überlesen habe aber ich vermute, dass wenn Du deine Abfrage mit feof etwas änderst es wieder funktioniert
zB:
bool eof=false; while(!eof /* !feof(from) */) { len = fread(buf, sizeof(char), 1024, from); AfxMessageBox(len/1024); len2=fwrite(buf, sizeof(char), len, to); eof=feof(from); if((len2 <= 0 || len <= 0) && !eof) { /* Fehler */ fclose(from); fclose(to); return -1; } }
-
Schau mal ins C++ FAQ. Da gibts nen beitrag wo erklärt wird, wie
man sowas mit Standard C++ macht.Devil
-
kein MFC-Code!
Verschoben nach C++
-
@dEUs: hättest das nicht vielleicht eher nach ANSI-C gepaßt?
-
hm, kann schon sein
Hab manchmal probleme zwischen C und C++ zu unterscheiden
-
für die C++ Leute ist das ganz einfach.
Wenn kein '::' vorkommt ist es C
-
?