C++ Umlaut im Dateipfad bei CopyFile() geht nicht...

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Prinzipiell müsste sowohl CopyFile("Startmenü",...) als auch CopyFile("Startmen\xFC"...) gehen.

Das Problem ist nur folgendes:

Je nach Windows-Version werden Umlaute in der ANSI-Version etwas anders auf der Festplatte gespeichert. Da würde ein "ü" zum Beispiel nicht als "ü" (= "\xFC"), sondern als "\xC3\xBC" gespeichert werden. Die Unicode-Version des Befehls (CopyFileW(L"...",L"...")) würde da wahrscheinlich Abhilfe schaffen.

Unter Windows Vista stimmen die angezeigten Dateinamen dann auch noch nicht mit den tatsächlichen überein (bei mir wurde zwar "Startmenü" im Explorer angezeigt, der tatsächliche Dateiname war jedoch "Start Menu" - in Windows 7 scheint dies nicht mehr so zu sein).

Um diesen Fall auszuschließen kann man folgendes Programm verwenden:

#include <stdio.h>

int main(int argc,char **argv)
{
    int i,j;
    for(i=1;i<argc;i++)
    {
        for(j=0;argv[i][j];j++)
        {
            if(argv[i][j]=='\\')
                printf("\\\\");
            else if(argv[i][j]>0x7e)
                printf("\\x%02X",argv[i][j]);
            else putchar(argv[i][j]);
        }
        putchar('\n');
    }
    getchar();
    return 0;
}

Funktionsweise:

Du compilierst das Programm. Dann ziehst du die Datei, deren Dateiname du wissen willst, per Drag&Drop auf die dabei entstande EXE-Datei. Der richtige Dateiname der Datei wird angezeigt. Wenn dann statt "Startmenü" "Start Menu" angezeigt wird, weißt du, wo der Fehler liegt.

Übrigens: Die Dateinamen von den Ordnern in "Dokumente und Einstellungen" ändern sich von Windows-Version zu Windows-Version. Man sollte die Funktion "SHGetFolderPath()" verwenden, um den tatsächlichen Namen dieser Ordner abzufragen.