Verständnisproblem beim Kopieren von Verzeichnissen
-
Hallo,
ich möchte gerne ein Verzeichnis A in ein Verzeichnis B kopieren.
#include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <dirent.h> #include <string.h> int main(int argc, char *argv[]) { DIR *verz1, *verz2; char *dir1, *dir2, *datei[2], buffer[1024]; int n, m; int eingabe = 0, ausgabe = 0; struct dirent *aktuelledatei; dir1 = argv[1]; dir2 = argv[2]; if ((verz1 = opendir(dir1)) == NULL) { fprintf(stderr, "Konnte Verzeichnis %s nicht lesen\n", dir1); return 0; } if ((verz2 = opendir(dir2)) == NULL) n = mkdir(dir2, 0755); while ((aktuelledatei = readdir(verz1)) != NULL) { if (strcmp(aktuelledatei->d_name, ".") > 0 && strcmp(aktuelledatei->d_name, "..") > 0) { datei[0] = aktuelledatei->d_name; datei[1] = datei[0]; eingabe = open(datei[0], O_RDONLY); ausgabe = open(datei[1], O_WRONLY | O_CREAT, 0755); while(n = read(eingabe, buffer, 1024) > 0) write(ausgabe, buffer, n); } } }
Die Dateien von Verzeichnis A landen dabei nicht in Verzeichnis B, sondern ausserhalb von diesem.
Beispiel: Ich befinde mich im Ordner /home/benutzer/programm. Innerhalb dieses Verzeichnisses befindet sich ein Verzeichnis "ein" mit drei Dateien.
Das (in /home/benutzer/programm befindliche) Programm rufe ich mit "prog ein aus" auf. Dabei landen die Dateien aus "ein" nicht in "aus" sondern in /home/benutzer/programm.Theoretisch müsste doch in den Schleifenkopf nur eine Bedingung für das Lesen des Ausgabeverzeichnisses mit eingebaut werden, damit die Dateien auch dort landen? Im Falle der Eingabedateien bekommt man ja mit aktuelledatei = readdir(verz1) einen Zeiger auf die Aktuelle Datei zurück. Deswegen klappt das Lesen aus "ein". Da es die Ausgabedateien in "aus"aber noch nicht gibt, ist mir nicht ganz klar wie diese Bedingung lauten müsste. Ich hoffe ihr versteht was ich meine.
-
Du solltest dem Programm auch den Zielpfad der Datei übergeben, woher soll es denn sonst wissen, wo es hinschreiben soll?
-
So, habe das Ding jetzt so hinbekommen, dass es die Dateien kopiert. Allerdings gibt es noch ein kleines Problem. Die Dateien werden kopiert, allerdings ist der Inhalt dieser nicht vollständig.
Zum Beispiel: test.txt, deren Inhalt ist "Hallo du da.". Die Kopie der Datei beinhaltet aber nur "H", also den Ersten Buchstaben. Ich schätze dies hat mit dem Zeiger auf char zu tun. Leider tu ich mich im Bereich Zeiger sehr schwer.
#include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <dirent.h> #include <string.h> int main(int argc, char *argv[]) { DIR *verz1, *verz2; char *dir1, *dir2, *datei[2], buffer[1024], ziel[128]; int n, m; int eingabe = 0, ausgabe = 0; struct dirent *aktuelledatei; dir1 = argv[1]; dir2 = argv[2]; if ((verz1 = opendir(dir1)) == NULL) { fprintf(stderr, "Konnte Verzeichnis %s nicht lesen\n", dir1); return 0; } if ((verz2 = opendir(dir2)) == NULL) { n = mkdir(dir2, 0755); //verz2 = opendir(dir2); } while ((aktuelledatei = readdir(verz1)) != NULL) { if (strcmp(aktuelledatei->d_name, ".") > 0 && strcmp(aktuelledatei->d_name, "..") > 0) { strcpy(ziel, dir2); strcat(ziel, "/"); strcat(ziel, aktuelledatei->d_name); datei[0] = aktuelledatei->d_name; datei[1] = ziel; eingabe = open(datei[0], O_RDONLY); ausgabe = open(datei[1], O_WRONLY | O_CREAT, 0755); while(n = read(eingabe, buffer, 1024) > 0) write(ausgabe, buffer, n); } } }
-
In der Tat ist das einzige Problem was ich hier sehe die Zuweisung an n. Durch die (fehlende) Klammerung wird n das Ergebnis des Vergleichs zugewiesen. Dieses ist, wenn die Schleife danach durchlaufen wird, 1. Damit schreibst Du auch nur ein Zeichen. Du möchtest in n aber gern den Rückgabewert von read haben:
while( ( n = read(eingabe, buffer, 1024) ) > 0) // ^ ^ write(ausgabe, buffer, n);