Forum
Tipps
News
Menu-Icon

C++: Dateipfade mit unterordnern ohne Laufwerksbuchstabe angeben

Hallo,

ich will gerade einen Installer programmieren.

Der installer soll auf meine externe Festplatte, und von dort aus, auf jedem beliebigen PC das gewünschte programm installieren.

Das problem:

Die Ordnerstrucktur auf der externen Festplatte lautet wie folgt:
X:\Programme\xxxxxinstaller\Data\XXOrdner

Nun soll der Installer von der Festplatte den Ordner "XXOrdner" nach C:\Users\XXX\AppData\Roaming kopieren.

Wie lautet jetzt der Befehl? Der Laufwerksbuchstabe der Externen kann ja immer unterschiedlich sein. Der installer befindet sich aber definitif auf der Externen in "xxxxinstaller" und wird auch von dort ausgeführt.

Danke,
Kostnix


Antworten zu C++: Dateipfade mit unterordnern ohne Laufwerksbuchstabe angeben:

Hallo,

Wenn du den Installer startest bist du ja bereits in
X:\Programme\xxxxxinstaller\

Von dieser Stelle aus müssten dann ein xcopy-Befehl
Data\XXOrdner C:\Users\XXX\AppData\Roaming /s /e
lauten.
Nicht getestet, muss bestimmt noch etwas dran rumgefeilt werden.

Wie kommst du zum Installer-Programm.
Soll ja wohl als Batch laufen in der Eingabeaufforderung laufen?
Schon was von dem Script vorhanden? 

Ok, habs hingekrigt.

Habe jetzt ein weiteres Problem: C:\Users\XXX\AppData\Roaming /s /e
ist ja im Beispiel immer noch XXX als User. Angenommen der PC , auf dem ich das ausführe hat nen andern Benutzernamen, muss ich doch Umgebungsvariablen bestimmen (%appdata%). Wie geht das in meinem fall?
bis jetzt heist der code:

system("xcopy  \"Data\\XXXordner\" \"C:User\XXX\Appdata\Roaming"");

« Letzte Änderung: 25.06.12, 17:30:54 von Kostnix »
system("xcopy "Data\XXOrdner" "C:\Users\XXX\AppData\Roaming /s /e"");

ok, die Syntax von C++ habe ich nicht intus ;)
Hast du aber hier nicht etwas viel Anführungszeichen ?
Evtl.
system(xcopy "Data\XXOrdner" "C:\Users\XXX\AppData\Roaming" /s /e);
Wobei beim Ziel C:\Users\XXX durch die Systemvariable %USERPROFILE% ersetzt werden kann.

Zitat
Auserdem: warum eigentlich dieses "/s /e" ?
das sind Parameter für den xcopy-Befehl
s=kopiert auch Unterverzeichnisse
e=kopiert auch leere Unterverzeichnisse

Alle Parameter sind mit xcopy /? in der Eingabeaufforderung zu sehen.
 

Ok, habs hingekrigt.

Habe jetzt ein weiteres Problem: C:\Users\XXX\AppData\Roaming /s /e
ist ja im Beispiel immer noch XXX als User. Angenommen der PC , auf dem ich das ausführe hat nen andern Benutzernamen, muss ich doch Umgebungsvariablen bestimmen (%appdata%). Wie geht das in meinem fall?
bis jetzt heist der code:

system("xcopy  \"Data\\XXordner\" \"C:User\\XXX\\Appdata\\Roaming\"");
Sorry, für die änderung meines letzten posts, war so nicht vorgeseehen.
 

« Letzte Änderung: 25.06.12, 17:33:44 von Kostnix »

genau, nicht %USERPROFIL% sondern %APPDATA%

system("xcopy  \"Data\\XXordner\" %APPDATA%"); 

« Letzte Änderung: 25.06.12, 17:35:38 von AchimL »

Also kann ich einfach:

system("xcopy  \"Data\\XXordner\" \"%Appdata%\"");

schreiben, und was Appdata ist, blickt der von alleine? 

« Letzte Änderung: 25.06.12, 17:37:05 von Kostnix »

habe vorherigen Post nochmal korrigiert.

APPDATA=C:\Users\Admin\AppData\Roaming

Eingabeaufforderung und set eingeben, dann siehst du alle Systemvariablen.

... und was Appdata ist, blickt der von alleine? 
sollte er blicken ;)

ich denke die Syntax müsste so sein:
system("xcopy  \"Data\\XXordner\" %APPDATA%");
 

Ich werds einfach mal ausprobieren

Hätte da noch 'ne frage.

Das Script ist von einem früheren Programm, daher sind noch alte includes drin. Wollte fragen welche includes ich denn brauche, wenn ich:

den Curser ändere:
system("color F");
   CONSOLE_CURSOR_INFO ci = {10,FALSE};
   SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ci);

wenn ich system("xcopy"); und system("pause"); verwende
und wenn ich über system dateien starte, z.B. system("setup.exe")

zum Cursor kann ich nichts sagen.

Das Dateihandling sollte doch die stdio.h machen, wenns die in C++ gibt.
Aber system("pause") wird wohl nicht funktionieren, das musst du wohl im C++ Script abfangen.

Ok. Soweit funktioniert jetzt alles. Schonmal vielen dank.

Was ich jetzt allerding bemerkt habe: wenn das programm fertig ist, sagt Windows "Das Programm wurde eventuell nicht richtig installiert".

Habe da mal was von einem "Es liegt kein Fehler vor"-befehl gehört, dass man an windows, am ende des Programms senden muss.

Wie kann ich diese Meldung verhindern?

da muss ich leider passen :(

da wird wohl eine Fehlermeldung kommen, denn %ProgramFiles(x86)% gibt es auf einem 32-bit System nicht als Systemvariable.

ProgramFiles=C:\Program Files auf einem 32-bit System

Stimmt, habs gerade ausprobiert, geht nicht.

Wie machen dass eigentlich die Profis?

Wenn ich ein Programm auf CD einlege und es installier, wird es immer ins richtige verzeichniss installiert.


Was ich jetzt machen will: Im Verzeichniss von Anno2070 möchte ich per c++ eine Datei hinzufügen. Das soll aber auf 32 und 64 -bit systemen klappen.

Wie mach ich das jetzt?

habe bis jetzt:

system("xcopy \"Data\\Files\" %ProgramFiles(x86)%\\Ubisoft\\Related Designs\\ANNO 2070");

blos: das funktioniert selbst bei mir nicht. Er sagt, "Unzulässige Parameteranzahl". Liegt wahrscheinlich daran, dass ich die Umgebungsvariable nicht so einfach erweitern kann.  

« Letzte Änderung: 25.06.12, 18:51:17 von Kostnix »

system("xcopy \"Data\\Files\" "%ProgramFiles(x86)%\\Ubisoft\\Related Designs\\ANNO 2070"");

Leerzeichen im Dateinamen wurde nicht abgefangen mit "xx xx"

 

Schade, funktioniert nicht.

Das:
"%ProgramFiles(x86)%\\Ubisoft\\Related Designs\\ANNO 2070"");

wird jetzt nicht in roter Schrift angezeigt, und bei ProgrammFiles steht "Der bezeichner "Programmfiles(x86)" ist nicht definiert". Auch die ganzen "\" werden als fehler markiert.

auf was für einem System, 32 oder 64-bit ?

ich hab Windows 7 Professional x64, von daher müsste es doch eigentlich gehen...
 Hier mal der Log von Visual Studio:

anno installer.cpp(44): error C2065: 'x86': nichtdeklarierter Bezeichner
anno installer.cpp(44): error C2017: Ungültige Escapesequenz
anno installer.cpp(44): error C2017: Ungültige Escapesequenz
anno installer.cpp(44): error C2017: Ungültige Escapesequenz
anno installer.cpp(44): error C2017: Ungültige Escapesequenz
anno installer.cpp(44): error C2065: 'Ubisoft': nichtdeklarierter Bezeichner
anno installer.cpp(44): error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'Related'
anno installer.cpp(44): error C2017: Ungültige Escapesequenz
anno installer.cpp(44): error C2017: Ungültige Escapesequenz
anno installer.cpp(44): error C2059: Syntaxfehler: ')'
anno installer.cpp(44): error C3861: "ProgramFiles": Bezeichner wurde nicht gefunden.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

hier mal die includes:

#include <iostream>
#include <windows.h>

« Letzte Änderung: 25.06.12, 20:08:11 von Kostnix »

werden Klammern hier auch als Sonderzeichen behandelt und müssen mit einem \ geschützt werden. Vermutlich schon.

Aha, glaub du hast recht. Die Klammern sind auch so grau hinterlegt.

Aber: mit einem \ schützen klappt nicht.:

system("xcopy \"Data\\Files\" "%ProgramFiles\(x86\)%\\Ubisoft\\Related Designs\\ANNO 2070"");


Meintest du so?  Der denkt immer noch, die Klammern seien irgendwie was zusammenhängendes...

Aber: ändert ein Backslash nicht das verzeichniss? Dann könnte man ja nicht einfach vor die Klammer ein \ setzen.

« Letzte Änderung: 25.06.12, 21:15:16 von Kostnix »

stimmt auch wieder, einen Backslash schützt man durch einen Backslash. Aber wie kann man eine Klammer schützen?
Schon mal bei google geschaut ?

UPDATE:

Habs gelöst, vor dem zweiten Pfad hat der \ gefehlt:

system("xcopy \"Data\\Files\" \"%ProgramFiles(x86)%\\Ubisoft\\Related Designs\\ANNO 2070\"");


jetzt funktionierts.

Danke für die mühen, kann geschlossen werden.

da schaut man es immer und immer wieder an und sieht es nicht ():-)


« Hilfe bei der Excel ProgramierungC# dynamische checkboxen überprüfen »
 

Fremdwörter? Erklärungen im Lexikon!
Festplatte
Die Festplatte, oft auch als Hard Disk Drive (HDD) bezeichnet, ist ein interner Datenträger im Computer. Man unterscheidet zwischen den Größen der Geh&aum...

Ordner
Ordner sind Strukturelemente in einem Dateisystem, die  Dateien und andere Ordner organisieren und speichern können. Sie ermöglichen eine strukturierte und...

AGP Schnittstelle
Die AGP (Accelerated Graphics Port) - Schnittstelle wurde in den 1990er Jahren eingeführt und war speziell für Grafikkarten in PCs konzipiert. Sie bot eine dire...