eine Datei überschreiben
-
Hi Leute, ich brauche mal eure Hilfe. Es ist folgende Situation: ich arbeite gerade an einem Programm, was die Konfiguration einer Linux Distribution beschleunigen soll. Bis jetzt geht auch alles gut. (Keine Angst, ich bin hier im richtigen Forum, handelt sich schon um "reines" ANSI C (oder fast)).
Das Programm soll jetzt eine Datei in einem Verzeichnis überschreiben, eigentlich ja kein Problem. Mit dem Befehl "system" und dem passenden Eintrag ist die Datei überschrieben. Jetzt soll das Programm aber eine Datei überschreiben, die auf jedem PC in einem anderen Ordner ist. Es ist ja kein Problem, den Benutzer nach dem Ordner zu fragen und im Programm zu speichern. Wie kann ich aber jetzt dem Programm sagen, dass er die Datei in dem angegeben Ordner überschreiben soll? Bei dem Befehl "system" oder so, kann ich ja nicht schreiben:
system("cp test/%s" Ordner);
Wie kann ich das Problem lösen?
-
Grundsätzlich ginge das mit snprintf und einem Buffer.
An der Stelle ist system aber keine gute Idee, wenn die Datei zB. einen lustigen Namen mit Semikolon drin haben sollte, bzw. der Benutzer (vielleicht versehentlich) sowas eingibt.Datei kopieren ist ja aber nicht sonderlich kompliziert und kann auch mit open, read und write selber gemacht werden.
-
char szHilf[128]; sprintf(szHilf, "cp test/%s" Ordner); system("szHilf");
DrGreenthumb schrieb:
An der Stelle ist system aber keine gute Idee, ....
völlig richtig
-
Horst2 schrieb:
char szHilf[128]; sprintf(szHilf, "cp test/%s" Ordner); system("szHilf");
Nicht wirklich...
Lasst doch mal dieses blöde system()
-
@interpreter: su solltest meinen beitrag auch zu ende lesen
Horst2 schrieb:
DrGreenthumb schrieb:
An der Stelle ist system aber keine gute Idee, ....
völlig richtig
-
Horst2 schrieb:
@interpreter: su solltest meinen beitrag auch zu ende lesen
Habe ich. Obwohl du system() nicht befürwortest bringst du dennoch ein Beispiel mit system()
PS: Du solltest auch nochmal deinen Code anschauen
-
ok hast recht.
char szHilf[128]; sprintf(szHilf, "cp test/%s" Ordner); system(szHilf);
wenn dann sollte man das falsche (schlechte) schon richtig hinschreiben
-
system, igit... das sollte man nicht benutzen.
Ich benutze immer meine eigene Funktion
int copyfile(const char* source, const char* destiny) { FILE* src, *dty; unsigned int read=0; char buffer[MAX_LENGTH]; if((src=fopen(source, "rb")) == NULL) return -1; if((dty=fopen(destiny, "wb")) == NULL) { fclose(src); return -2; } while( (read = fread(buffer,1,MAX_LENGTH, src)) > 0 ) { if(read != fwrite(buffer, 1, read, dty)) { fclose(dty); fclose(src); error_call("Not all data could be copied into %s. Proc. aborted.", destiny); fclose(dty); fclose(src); return -3; } } fclose(dty); fclose(src); return 0; }
wobei error_call ein wrapper für fprintf(stderr, ...
-
supertux schrieb:
Ich benutze immer meine eigene Funktion
int copyfile(const char* source, const char* destiny)
Schlag mal im Wörterbuch nach, was destiny bedeutet
while( (read = fread(buffer,1,MAX_LENGTH, src)) > 0 ) { if(read != fwrite(buffer, 1, read, dty)) { fclose(dty); fclose(src); error_call("Not all data could be copied into %s. Proc. aborted.", destiny); fclose(dty); fclose(src); return -3; } } fclose(dty); fclose(src); return 0; }
da sind aber viel fclose() drin... Und ich weiß auch nicht, ob diese Fehlerabfrage so sinnvoll ist.
Und überhaupt, um eine Datei zu kopieren, würde ich im Realfall nur die direkten Systemfunktionen nehmen. Aber naja, is ja das Ansi-C-Forum hier.
-
DrGreenthumb schrieb:
Schlag mal im Wörterbuch nach, was destiny bedeutet
da hast du Recht, den Code habe ich schon lange Zeit her geschrieben und verstand damals nicht viel Englisch, ich hab jetzt nur Copy & Paste gemacht
-
also da benutz ich lieber kurz system.
Wenn jemand eine GUTE Alternative hat dann her damit.
-
hoeher schrieb:
also da benutz ich lieber kurz system.
Wenn jemand eine GUTE Alternative hat dann her damit.Also ich benutze lieber Schlüssel als Granaten.
Jede Alternative ist besser als system()!
Kurz mal eine kleine Dateikopierfunktion geschrieben und schon kann man diese benutzen und das auch noch viel kürzer und einfacher als mit system(). Wenn man diese Funktion dann auch noch in eine extra .c Datei auslagert, dann kann man sie sogar in anderen Programmen verwenden.