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.)


Anmelden zum Antworten