Dateien umbenennen
-
Hallo, ich moechte alle Dateinamen mit Grossbuchstaben in einem Verzeichnis
umwandeln in Kleinbuchstaben (unter Linux). Mein Programm scheitert daran,
dass die Bibliotheksfunktion rename() als Argumente const char* benoetigt,
ich aber nur char* Zeiger habe. So sieht mein Code aus:#include <stdio.h> #include <ctype.h> #include <string.h> #include <dirent.h> #include <sys/types.h> int main(void) { DIR *dirz; struct dirent *direntz; const char *path = "/home/gigg/test1/"; char name_old[256], name_new[256]; int i; dirz = opendir(path); if(dirz == NULL) fprintf(stderr,"Kann Verzeichnis nicht oeffnen\n"); while((direntz = readdir(dirz)) != NULL) { for(i = 0; i < 256; i++) *(name_old+i) = '\0'; for(i = 0; i < 256; i++) *(name_new+i) = '\0'; strcpy(name_old,direntz->d_name); i = 0; while(*(name_old+i) != '\0') { *(name_new+i) = tolower(*(name_old+i)); ++i; } rename(name_old,name_new); } closedir(dirz); return 0; }
Hat jemand eine Idee?
Danke
-
Hallo,
const char ist hier nur eine Zusicherung der Funktion rename, dass sie den "Inhalt" von name_old und name_new nicht ändern wird, daran liegt es nicht, vielmehr bekommt dirz keinen sinnvollen Wert und ist damit nutzlos ...
MfG,
Probe-Nutzer
-
Komisch, bei strcpy macht es dir auch keine Probleme.
Die Warnung aus Zeile 14 sollte dir viel mehr sorgen machen.Die Strings brauchst du auch nicht löschen.
Wenn du das unbedingt möchtest, nimm memset.
-
Oh, es scheint beim copy und pasten eine Zeile
verlorengegangen zu sein. Es muss natuerlich heissen:dirz = opendir(path); if(dirz == NULL) ...
Ich korrigiere das mal im 1.Post
-
gigg schrieb:
Oh, es scheint beim copy und pasten eine Zeile
verlorengegangen zu sein. Es muss natuerlich heissen:Demnach hast du das Programm noch gar nicht ausprobiert?
(sonst hättest du den ganzen Code auf einmal kopieren können)
Das ist blöd.
Existiert das Problem überhaupt noch?
-
DirkB schrieb:
gigg schrieb:
Oh, es scheint beim copy und pasten eine Zeile
verlorengegangen zu sein. Es muss natuerlich heissen:Demnach hast du das Programm noch gar nicht ausprobiert?
(sonst hättest du den ganzen Code auf einmal kopieren können)
Das ist blöd.
Existiert das Problem überhaupt noch?Doch ich habe es unter Linux ausprobiert, funktionierte auch alles
bis aufs umbenennen. Ich habe mir mit printf() die Dateinamen anzeigen
lassen. War alles ok.
Dann ueber USB-Stick auf meinen anderen Rechner (OpenBSD),
auf dem Internet laeuft.Also Problem besteht immer noch.
Danke fuer eure Hilfe.
-
Probe-Nutzer schrieb:
Hallo,
const char ist hier nur eine Zusicherung der Funktion rename, dass sie den "Inhalt" von name_old und name_new nicht ändern wird, daran liegt es nicht, vielmehr bekommt dirz keinen sinnvollen Wert und ist damit nutzlos ...
MfG,
Probe-Nutzer
ich dachte, dass const bedeutet, dass ich die Variable (hier den String)
nicht aendern kann. Aber dass muss ich ja, das ist ja gerade die Aufgabe
des Programms.Gruesse
-
Hallo nochmal,
habe das Problem geloest. Die Dateien, die ich umbenennen wollte,
hatten durch das Kopieren vom USB-Stick (FAT) die (UNIX-)Rechte verloren.
Mein Programm war also nicht berechtigt, die Dateien umzubenennen.Bloeder Fehler, der Code war ansonsten in Ordnung. Vielen Dank noch mal
und sorry, dass ich eure Zeit gestohlen habe.Gruesse
-
gigg schrieb:
ich dachte, dass const bedeutet, dass ich die Variable (hier den String)
nicht aendern kann. Aber dass muss ich ja, das ist ja gerade die Aufgabe
des Programms.Deine Variable path kannst du auch nicht ändern.
Bei rename gilt das const aber für die Parameter. D.h. in der Funktion werden die Daten nicht geändert.
Und wie schon geschrieben, ist der 2. Parameter von strcpy auch vom Typconst char*
Und da hat es dich auch nicht gestört.
-
DirkB schrieb:
Und wie schon geschrieben, ist der 2. Parameter von strcpy auch vom Typ
const char*
Und da hat es dich auch nicht gestört.Den Compiler (gcc) hat es nicht gestoert. strcpy() hat er mit den char*
sauber durchgefuehrt. Ich habe nur geraetselt, warum rename() einen
Return-Wert -1 geliefert hat und nur das Umbenennen der Dateien nicht funktioniert hat.
Daher war es meine Vermutung dass es an dem const liegt.Aber jetzt habe ich dem Ordner und den Dateien
Schreib- und Ausfuehrungsrecht gegeben und dann hat alles geklappt.Danke nochmal
-
if(rename(name_old,name_new) == -1) perror("Fehler bei rename");
Damit du eine Fehlermeldung bekommst.