Sonderzeichen in Dateinamen
-
Hi,
ich habe Probleme beim rekursiven Durchsuchen von Verzeichnissen.
Und zwar sobald ein Sonderzeichen im Verzeichnisnamen auftaucht
erhalte ich ein ? statt des Zeichens und kann deshalb das entsprechende
Verzeichnis nicht per opendir öffnen.Hat Jemand ne Ahnung, wie ich trotzdem in das Verzeichnis wechseln
kann, oder noch besser, den Verzeichnisnamen mit dem Sonderzeichen
umbenennen?Ich habe bereits versucht es per rename umzubenennen, aber ohne
Erfolg. Da ich ja von der Datei z.B.: "sonΘer" ausgehend ja bloß
rename("son?er", "son_er");
machen kann und das offenbar nicht funktioniert...Sebastian
-
Vielleicht mit Unicode probieren?
-
Ich muss gestehen ich bin nicht besonders versiert in C. Also ich mache
folgendes um an das Verzeichnis zu kommen (in Kurzform):info = readdir(dir); verz = (*info).d_name;
Wie kann ich das denn in Unicode umwandeln? Liefert mir d_name nicht
immer einen Ansi-String (der dann schon das ? enthält)? Oder gibt es
eine andere Möglichkeit den Namen des Verzeichnisses zurückgeben
zu lassen?Sebastian
-
"readdir" kenne ich nicht. Das macht aber auch nichts. Du musst nur herausfinden ob es auch eine Unicode-Version dieser Funktion gibt. Ist aber auch nur eine Vermutung von mir, dass es mit der Unicode-Version funktionieren würde.
-
swald schrieb:
Ich habe bereits versucht es per rename umzubenennen, aber ohne
Erfolg. Da ich ja von der Datei z.B.: "sonΘer" ausgehend ja bloß
rename("son?er", "son_er");
machen kann und das offenbar nicht funktioniert...C kennt auch nicht die Shellsymbolik von '?'. -- Du bist hier genaugenommen falsch. Falls es um ein POSIX-System (Unix?) gehen sollte: Dort lassen sich alle Operationen auf Dateien auf ein paar Grundfunktionen zurückführen, die nur Interfaces mit char*s anbieten (siehe open). Ob sie intern Unicode können, oder nicht, spielt keine Rolle.
Das, was Du als Theta vielleicht in die Shell tippst, wird in eine Nummer verwandelt, den die C-Standardlocale ein anderes äußeres Erscheinungsbild verpasst. Die kannst Du mal ändern.
-
hm... Es scheint auch keine unicode-version von readdir zu geben. Nur
für lange Dateinamen, die aber soweit ich gesehen habe auch, wie du sagst
mit char *s arbeiten.Das Theta hab ich hier nur mittels mangelnder Alternativen benutzt. Das
Problem tritt auf einem Windows-Rechner auf und die Sonderzeichen stammen
von einem Macintosh. Dort wird das als Pfeil dargestellt und unter
Windows als kaum sichtbarer Punkt.
-
Und was machst Du jetzt genau? Du öffnest mit opendir ein Verzeichnis, dessen Name der Benutzer eingegeben hat? opendir schlägt fehl, weil es das Verzeichnis angeblich nicht gibt? Kannst Du ein minimales Beispielprogramm schreiben?
Der Fehler in einem solchen Szenario liegt meist in der Benutzereingabe. Du kannst Dir ja mal in der DOS-Box und anderen Programmen umsehen, wie da die Dateien heißen, über den Namen herrscht wohl keine Einigkeit, weil unterschiedliche Zeichensätze verwendet werden. -- Wahrscheinlich ist es am schlauesten, solche Dateinamen generell zu vermeiden, wenn man mit der Welt interagieren möchte.
-
#include <dirent.h> #include <stdlib.h> #include <string.h> #include <sys\stat.h> void search(char *akt) { char *tmp; // Vollstaendiger Datei/Verzeichnisname DIR *dir; // Zeiger auf aktuelles Verzeichnis struct dirent *info; // Info ueber aktuelle Datei struct stat att; // Dateiattribute der aktuellen Datei // Fehler beim Oeffnen des Verzeichnisses if ((dir = opendir(akt)) == NULL) { printf("Fehler beim Oeffnen von: %s\n", akt); return; } // Verzeichnis geoeffnet, Unterverzeichnisse durchsuchen while ((info = readdir(dir)) != NULL) { tmp = (char *) malloc(strlen(akt) + strlen(info->d_name) + 2); strcpy(tmp, akt); strcat(tmp, "\\"); strcat(tmp, info->d_name); stat(tmp, &att); if (att.st_mode & S_IFDIR && info->d_name[0] != '.') { search(tmp); } free(tmp); } closedir(dir); } int main(int argc, char *argv[]) { if(argc != 2) { // Genau 2 Parameter notwendig return fprintf(stderr, "Benutzung: %s <Verzeichnis>\n", argv[0]), 1; } search(argv[1]); // Suche starten }
So sieht die Grundstruktur aus. Praktisch wird nur die Verzeichnisstruktur durchlaufen
aber sobald ein besagtes Verzeichnis auftaucht, bekomme ich den Fehler:Fehler beim Oeffnen von: c:\mac(?)
Wenn ich unter der Konsole per Tab-Completion in das Verzeichnis wechseln will,
erhalte ich denselben Pfad:C:\>cd "\mac(?)"
Also effektiv sehe ich das Sonderzeichen bloß (wenn auch nicht richtig als Pfeil) im
Explorer. Das Problem ist, dass diese Mac-Daten von Kunden kommen, die ihre
Verzeichnisse eben teilweise so benennen. Klar wäre es am besten, wenn keiner solche
Sonderzeichen verwenden würde, aber was mache ich dann mit den alten Daten? Die
müssen so oder so umbenannt werden.
-
Übergibst du deinem Programm beim Aufruf gleich ein Verzeichnis mit Sonderzeichen oder kann es nur nicht die Verzeichnisse öffnen, die es per readdir gefunden hat?
-
Das tritt bei beiden gleichermaßen auf. Wenn ich direkt das falsche Verzeichnis angebe
hört er halt sofort wieder auf, ansonsten läuft er korrekt durch (was ich auch getestet
habe, indem ich die durchlaufenen Verzeichnisse ausgegeben habe.)