[c++] MoveFile()

Shonn

Ref-Jäger
ID: 127902
L
5 Mai 2006
584
16
Guten Tag,
Leider hab ich seit einer Woche ein Problem mit dem ich nach langer suche bei google einfach nicht weiter komme.....

Es geht darum ein String in eine MoveFile Methode zu übergeben, die ein Pfad enthält.

So sieht mein Code aus:
int main()
{
string a = "C:/abc.txt";
string b = "C:/Programme/abc.txt";
MoveFile (a,b);
}

Leider bekomm ich ein Fehler dabei:
error C2664: 'MoveFileW': Konvertierung des Parameters 1 von 'std::string' in 'LPCWSTR' nicht möglich

Auch wenn ich MoveFile (_L(a),_L(b)) mache bekomm ich:
error C3861: "_L": Bezeichner wurde nicht gefunden.

Allerdings funktioniert MoveFile (_L("C:/abc.txt"),_L("C:/Programme/abc.txt"))


Kennt sich da vielleicht jemand aus? Und kann mir helfen?

Mit freundlichem Dank von
Shonn
 
Was bitte soll den _L für ne Funktion sein? Schon mal a.c_str() und b.c_str() versucht an der Stelle einzusetzen?
 
Was bitte soll den _L für ne Funktion sein?
Die Windows-Headerfiles stellen irgendwie ein Makro _T zur Verfügung, was die Konvertierung bei Verwendung der WideCharacter-Funktionen vornimmt - afaik.

@Shonn:
Bei Pfadangaben unter Windows werden die Verzeichnisse mit Backslashes (\) separiert. So wird dir MoveFile() das wahrscheinlich nicht annehmen.
 
Das Backslash (\) wird auch wirklich als Backslash erkannt und funktioniert somit nicht im String. Allerdings könnte man 2 Backslashes verwenden oder das Zeichen '/'.
Wisst ihr zufällig wie ich das Backslash Zeichen in ein String rein kriege und es nicht als Backslash erkannt wird?
 
Wisst ihr zufällig wie ich das Backslash Zeichen in ein String rein kriege und es nicht als Backslash erkannt wird?
Blick grad nicht 100%ig, was du meinst, tipp aber drauf, dass es um das Escapen geht.
Ein Backslash wird in C/C++ als '\\' notiert. Verwendest du nur '\', wird das Folgezeichen dazu als Escape-Sequence betrachtet bzw. wenn das Nonsense is, sollte der Compiler schon den Zeigefinger zeigen.

Ein normaler Slash in einem Windows-Pfad ist auf alle Fälle falsch. Das kannst du unter UNIX machen, aber nicht unter Windows.
 
Naja, jedenfalls funktioniert das Zeichen / bei mir.

Aber was ist wenn ich jetzt ein String habe mit einem Backslash also \ wie z.B.
string str = "abcsd\sdfdfsd";

^^Das wird wegen dem Backslash nicht funktionieren aber wie mach ich es, dass das Zeichen auch im String als Zeichen ist?
 
Naja, jedenfalls funktioniert das Zeichen / bei mir.
Du solltest bei Programmierung niemals dein Glück herausfordern.
Aber was ist wenn ich jetzt ein String habe mit einem Backslash also \ wie z.B.
string str = "abcsd\sdfdfsd";
In diesem String ist kein Blackslash drin, das is der Punkt ;)
PHP:
str[0] = 'a',
str[1] = 'b',
str[2] = 'c',
str[3] = 's',
str[4] = 'd',
str[5] = '\s', // ungültige Escape-Sequenz (Compiler-Warning)
str[6] = 'd',
str[7] = 'f', ...
Guck mal hier:
https://tutorial.schornboeck.net/escape.htm
 
Und wie bekomm ich das Zeichen \ in mein String rein? Irgendwie kann man das Zeichen doch ausgeben, oder?
 
Ah, stimmt hast Recht durch 2 mal \ eingeben. Allerdings werden das glaub ich ziemlich viele \\, ich würde eher, wie ich herausgefunden habe 0x5C setzen.

Aber kommen wir nun zu meinem Hauptproblem mit MoveFile(), kann mir da nun jemand weiter helfen?
 
Ah, stimmt hast Recht durch 2 mal \ eingeben. Allerdings werden das glaub ich ziemlich viele \\, ich würde eher, wie ich herausgefunden habe 0x5C setzen.
Man kann auch zwanghaft schlampig arbeiten, klar. Ich behaupte mal, \x5c is länger und unübersichtlicher als einfach nur \\ ;)
Aber kommen wir nun zu meinem Hauptproblem mit MoveFile(), kann mir da nun jemand weiter helfen?
Das is doch schon lange gelöst, drum bin ich da nicht mehr drauf eingegangen. Oder hat es nicht funktioniert?
 
Ich vermute mal, du benutzt dem MSVC...

Nein, leider nicht. Ich muss den String irgendwie in LPCWSTR umwandeln.
Wenn du nicht unbedingt mit WCHAR-Strings arbeiten musst, würde ich mal gucken, ob du in den Projekteinstellungen das UNICODE-define entfernen kannst [1]. Oder, die unschönere Lösung, du nimmst einfach die Funktion MoveFileA(...) [2].

Ansonsten solltest du die c_str()-Methode benutzen, um aus dem STL string einen Pointer zu machen [3]. Unter Umständen funktioniert's vielleicht auch ohne, aber das ist nicht garantiert; siehe unten.

Alternativ könntest du auch gleich WCHAR-strings [3] benutzen:
PHP:
basic_string<WCHAR> a = TEXT("C:\\abc.txt");
basic_string<WCHAR> b = TEXT("C:\\Programme\\abc.txt");
MoveFile( a.c_str(), b.c_str() );
(Wenn auch TEXT nicht definiert ist, funktioniert vielleicht L"C:\\abc.txt".)

Ah, stimmt hast Recht durch 2 mal \ eingeben. Allerdings werden das glaub ich ziemlich viele \\, ich würde eher, wie ich herausgefunden habe 0x5C setzen.
Es ist gängige Praxis, '\\' zu benutzen, und auch Du solltest dich daran halten. Es hat schon seine Gründe, dass die Dinge so gemacht werden, wie sie gemacht werden.

MfG
Sven


PS: Google ist dein Freund! [4]

[1] https://msdn.microsoft.com/en-us/library/cc500319.aspx
[2] https://msdn.microsoft.com/en-us/library/aa365239(VS.85).aspx
[3] https://www.sgi.com/tech/stl/basic_string.html
[4] https://www.google.de/search?hl=de&q=std::string+wchar*
 
Hast recht, ich benutze VC2005 !
Deine Lösung funktioniert leider nicht, allerdings hab ich es selber geschafft, dass es funktioniert. Ich hab einfach wie du gesagt hast UNICODE deaktiviert und da LPCWSTR das selbe wie const char* ist hab ich die Variable damit definiert und es hat geklappt !!!

UNICODE in den Eigenschaften auf "nicht festgelegt" setzen
int main()
{
const char * a = "C:/abc.txt";
const char * b = "C:/Programme/abc.txt";
MoveFile (a,b);
}

Danke an alle die mir geholfen haben !!!!!

Mit Gruß von
Shonn