Pfad suchen und einen Ordner zurückspringen



  • Hallo liebe Community,

    hätte da mal wieder eine Frage.
    Unzwar möchte ich mir ConfigFiles von meinem Counter-Strike Ordner auf meinem Desktop kopieren.
    Dafür habe ich schon folgende Funktion.

    string getSteamPath()
    {
        unsigned char temp[99] = {""};  
        unsigned long size = sizeof(temp);
        HKEY hKey;
    
        RegOpenKey(HKEY_CURRENT_USER, "Software\\Valve\\Steam", &hKey);
        RegQueryValueEx(hKey, "ModInstallPath", NULL, NULL, temp, &size);
        RegCloseKey(hKey);
    
        stringstream tmpStrm;
        tmpStrm << temp;
    
        return tmpStrm.str();
    }
    
    int main()
    {
    string path = getSteamPath() + "\\config.txt";
    const char *outFilePath = "config.txt";
    
    ifstream inFile(path.c_str());
    ofstream outFile(outFilePath);
    
    string line;
    
        while (getline(inFile, line))
        {
            if (line.find("//") != string::npos|| line.find("bind") != string::npos)
            {
                outFile<<line<<endl;
            }
        }
    
    inFile.close();
    outFile.close();
    
    return 0;
    }
    

    Allerdings geht er dort in den Ordner "half-life" (weil es in der Regedit so steht). Wenn ich aber einen Ordner zurückspringen könnte, wäre dort in dem Oberordner der Ordner "counter-strike", in den ich ja ursprünglich will.
    Kann mir nun also jemand sagen, wie ich einen Ordner zurückspringen kann?
    Evtl. sowas wie "//half-life\\counter-strike\\cstrike\\config.cfg"

    Also er geht wieder aus dem half-life Ordner und geht dann in den danebenliegenden Ordner counter-strike.

    Ich hoffe ihr versteht meine Frage 😃

    Und ich hoffe auch das mir jemand dafür eine Antwort geben kann, über google und Forumsuche habe ich da leider nichts gefunden.

    Mit freundlichen Grüßen
    zacharyy



  • Probiers mal so:

    ..\\counter-strike\\cstrike\\config.cfg



  • drakon schrieb:

    Probiers mal so:

    ..\\counter-strike\\cstrike\\config.cfg

    Geht leider nicht, weil der Regedit Pfad ja:
    \\half-life\\cstrike\\config.cfg ist.

    Das heisst, der Oberordner, wo der "counter-strike" und der "half-life" Ordner drin sind, heisst "ACCOUNTNAME".

    Also finde ich zurzeit den Pfad:
    ACCOUNTNAME\\half-life\\cstrike\\config.cfg

    Möchte aber einen Ordner zurückspringen, zu dem Pfad:
    ACCOUNTNAME\\counter-strike\\cstrike\\config.cfg



  • Das was du suchst wird std::string::replace sein.

    const char* replace( const char* str, const char* pattern, const char* rep )
    {
        static std::string sPath = str;
        size_t offset = sPath.find_first_of( '\\' )+1; // Position von \ überspringen
    
        sPath.replace( offset, strlen(pattern), rep, strlen(rep) );
    
        return sPath.data();
    }
    


  • feraL schrieb:

    Das was du suchst wird std::string::replace sein.

    const char* replace( const char* str, const char* pattern, const char* rep )
    {
        static std::string sPath = str;
        size_t offset = sPath.find_first_of( '\\' )+1; // Position von \ überspringen
    
        sPath.replace( offset, strlen(pattern), rep, strlen(rep) );
    
        return sPath.data();
    }
    

    Hm ich bin mir nicht ganz sicher ob dass das richtig ist.
    Er soll ja nur einen Ordner zurückgehen, damit ich von dem Ordner aus zu einem anderen Unterordner kann. Dein Code sieht nicht danach aus, als wenn er das machen könnte oder sehe ich da was falsch?
    Wie wende ich das denn dann am besten -mit meinem oben geposteten Code- an?
    Und eine kleine Erklärung, was genau die Funktion an sich macht, wäre sehr nützlich.



  • So klappt es leider nicht bei mir:

    string path = getSteamPath() + replace() + "\\counter-strike\\config.txt";

    Also er sucht den Pfad (z.B. C:\\Steam\\steamapps\\accountname\\half-life\) und geht ja dann einen Ordner zurück also so: C:\\Steam\\steamapps\\accountname\.
    Und genau so bräuchte ich das ja, weil ich dann so weitergehen kann:
    C:\\Steam\\steamapps\\accountname\\counter-strike\\config.txt.



  • Lern bitte erstmal die Grundlagen, denn anscheinend beherrscht du sie nicht.



  • Naja die Grundlagen beherrsche ich schon, nur wenn ich deinen code nicht ganz verstehe... 😞
    Sieht für mich einfach nicht danach aus, als wenn er durch deinen code gleich einen Ordner zurückspringt. 😮



  • Hm, ich bin zwar selbst noch ein ziemlicher Knubbel, aber wo ist denn das Problem? So wie ich das sehe, sucht feraLs code nach dem ersten Vorkommen von nem Backslash und ersetzt den weiteren Pfad mit deinem beliebigen Pfad. Allerdings solltest du nicht nach nem Backslash suchen, sondern nach dem Vorkommen von "half-life". Diesen Offset muesstest du dann direkt so uebernehmen koennen und ihn mit dem Pfad deiner Wahl "replacen".
    Es geht hier nicht darum, einen Ordner zurueckzuspringen, sondern den Pfad so zu parsen (oder wie auch immer man das nennen soll) wie du ihn benoetigst.



  • kaWUSCH schrieb:

    Hm, ich bin zwar selbst noch ein ziemlicher Knubbel, aber wo ist denn das Problem? So wie ich das sehe, sucht feraLs code nach dem ersten Vorkommen von nem Backslash und ersetzt den weiteren Pfad mit deinem beliebigen Pfad. Allerdings solltest du nicht nach nem Backslash suchen, sondern nach dem Vorkommen von "half-life". Diesen Offset muesstest du dann direkt so uebernehmen koennen und ihn mit dem Pfad deiner Wahl "replacen".
    Es geht hier nicht darum, einen Ordner zurueckzuspringen, sondern den Pfad so zu parsen (oder wie auch immer man das nennen soll) wie du ihn benoetigst.

    Dann war das so ja richtig:

    zacharyy schrieb:

    string path = getSteamPath() + replace() + "\\counter-strike\\config.txt";

    Allerdings kriege ich dann errors.

    error C2015: too many characters in constant
    error C2668: 'find_first_of' : ambiguous call to overloaded function
    error C2660: 'replace' : function does not take 0 parameters
    


  • Da steht ja genau, was falsch ist.. 🙄



  • drakon schrieb:

    Da steht ja genau, was falsch ist.. 🙄

    Richtig und wenn ich das dann ändere

    string replace() 
    {
    	const char* str;
    	const char* pattern;
    	const char* rep;
        static string sPath = str;
        size_t offset = sPath.find_first_of('\\')+1;
        sPath.replace(offset, strlen(pattern), rep, strlen(rep));
        return sPath.data();
    }
    

    Klappt es zwar ohne Fehler, aber er liest mir die Config nicht aus.
    Ist evtl. der Pfad falsch?
    Es wird ja nach dem half-life Pfad gesucht:
    "C:\\blabla\\Steam\\steamapps\\Accountname\\half-life\"

    .. Das heisst ich springe mit der 'replace' Funktion einen Ordner zurück: "C:\\blabla\\Steam\\steamapps\\Accountname\"

    Und gehe dann von da aus zu: "counter-strike\\cstrike\\config.cfg"

    Der komplette Pfad zur Config wäre also:
    "C:\\blabla\\Steam\\steamapps\\Accountname\\counter-strike\\cstrike\\config.cfg"

    Doch warum funktioniert das jetzt nicht?


Anmelden zum Antworten