C++ Umlaut im Dateipfad bei CopyFile() geht nicht...
Hallo C++-Auskenner, ich habe mal wieder eine Frage bzw. ein für mich unlösbares Problem. Ich verwende CopyFile(), im Dateipfad ist jedoch ein "ü" enthalten ("Startmenü"), weshalb es nicht funktioniert. Ich habe auch alles getestet es liegt wirklich am ü. Leider funktioniert es auch mit dem Code \x81 nicht.... Was muss ich tun, bzw. wie behebe ich das Problem? Bitte um Hilfe! > char username[128]; char Kopierpfad [328]; char Kopierpfad1 [100] = {"C:\Dokumente und Einstellungen\"}; char Kopierpfad2 [100] = {"\Startmen"}; char Kopierpfad3 [100] = {"\Programme\Autostart\PHv2.exe"}; DWORD usernamelen;
/FreeConsole();/ GetUserName(username, &usernamelen); strcat(Kopierpfad,Kopierpfad1); strcat(Kopierpfad,username); strcat(Kopierpfad,Kopierpfad2); strcat(Kopierpfad,"\x81"); strcat(Kopierpfad,Kopierpfad3); CopyFile("C:\Dokumente und Einstellungen\Yannick\Eigene Dateien\PHv.exe",Kopierpfad,TRUE);
2 Antworten
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.
Benutze Unicode escape Sequenz
http://stackoverflow.com/questions/331690/c-source-in-unicode
So?
C:\\Dokumente und Einstellungen\\Yannick\\Eigene Dateien\\PHv.exe","C:\\Dokumente und Einstellungen\\Yannick\\Startmen\u00FC\\Programme\\Autostart\\PHv2.exe"
Des geht nämlich nicht...
Hier ist eine Tabelle:
http://www.rapidtables.com/code/text/unicode-characters.htm