CString Pfad



  • Hallo!

    Wie bekomme ich am schnellsten aus einen Pfad (CString)
    z.b.: C:\test1\test2\test3\bildname

    das ganze mit doppel \\ ?

    -> C\\test1\\test2\\test3\\bildname

    Ich muss einer Funktion den Pfad mir Bildnamen zum speichern mitgeben, nachdem es nicht ging bin ich jetzt drauf gekommen das ich imme zwei Backslash machen muss...
    Gibt es da eine einfache Funktion dafür?
    Bzw. wie stell ich das am besten an?

    Vielen Dank im Voraus für euer Bemühen!
    LG, Ronny



  • mal die msdn anwerden und nach CString suchen und die Methoden durchforsten....



  • Replace(...)



  • Hallo und Danke für die Antworten!

    Jedoch ist das Backslash im String ja anscheinend kein normales Zeichen und mit Replace funktioniert es nicht....

    Wenn ich
    string.Replace("\","\"); -> Compiler Fehler

    string.Replace("\","\\\"); -> Compiliert zwar aber Funktioniert nicht....

    ????????? ich hab echt keine Ahnung was ich tun soll!!! ????????



  • Servus,

    eigentlich sollte das wunderbar funktionieren.

    Woher kommt denn der Inhalt deiner Variable? Von einem Edit? Aus einer Datei? Überprüf mal ob wirklich das richtige in der Variable steht. (Debuggen)

    *winke*
    Hellsgore



  • Servus!

    Danke für deine Antwort!

    Aber in datei steht es eientlich richtig drinnen...
    Habe jetzt noch folgendes probiert und es hat auch nicht funktioniert:

    void CBasicappView::OnDone() 
    {
    	// if Channel in Bild Nr. = 1 
    	// Close
    	// else nicht schließen lassen!!
    
    	CString name = "C:\ordner1\ordner2\datei";
    
    	int rv = name.Replace("\\","\\\\");
    
    	MessageBox(name);
    }
    

    Die MessageBox gibt den den String name komplett ohne \ aus!
    😕 😕



  • ups sorry die kommentare darüber habe ich versehentlich mit genommen!!
    einfach nicht beachten haben damit nichts zu tun........



  • wie waere es mit

    int rv = name.Replace("\","\\");
    

    was ist dagegen einzuwenden? in deinem string sind ja einfache drinn.

    zur not mach halt foldendes

    - ne schleife von 0 bis stringlaenge

    - untersuche jedes zeichen

    - ist zeichen ein \ dann schreibe dahinter \ und aktualisiere die laenge.

    fertig

    in der art wie

    for ( int i = 0; i < name.getlenght(); i ++)
    {
    
    if( name.mid(i,1) == "/")
    {
    
    // dahinter halt dann in der i+einten oder i - einten stelle ein weiteres \ einfuegen
    }
    
    }
    


  • Wenn du einen String IN C++ definierst, musst du zwei \ machen, weil \ ein Escape-Zeichen ist. Das heißt, \ hat eine besondere Bedeutung, zB bei \n = neue Zeile. Wenn du jetzt (im Code!!) einen normalen Backslash schreiben willst, musst du ihn escapen: zB wäre "\n" eine neue Zeile, aber "\\n" EIN Backslash und ein n.

    Wenn der User z.B. "C:\foo.txt" eingibt, dann stimmt der Pfad! Würdest du das im Code schreiben wollen, müsstest du "C:\\foo.txt" schreiben, da der Compiler sonst das escape-Zeichen "\f" erkennt!

    So ungefähr verstanden?



  • He super danke so hab ich es verstanden!!!!!

    Aber ich lese den Pfad aus einer ini Datei eben mit einem Backslash und muss das so konvertieren wie es aussehen würde wenn es der user eingibt mit zwei Backslash..
    Und nachdem Bachslash eben so ein Ecsape zeichen ist macht mir das ziemliche schwierigkeiten!

    (Aber jetzt weiß ich zumind. wieso es einmal \ und einmal \\ heisst....)

    lg, ronny



  • also in der text oder ini datei steht z.b.

    C:\ordner1

    so das ist der pfad

    jetzt liest du die zeile ein ( meintetwegen in eine CString varialbe namens "name" )

    dann hast du z.b. als auswahl pic1.jpeg

    dann machst du folgenden ( ohne replace oder sonstwas )

    name = name + "\\pic1";
    
    // wenn du von einer listbox den bild namen brauchst 
    //wiess jetzt auch nciht genau den befehl
    // CString auswahl = meineListbox.naja die aktuelle postion halt
    name = name + "\\" + auswahl;
    

    so einfach. das möchtest du doch machen oder?

    hier wie man zeilenweise einliest ( in meiner ini datei steht nur eine zeile

    CStdioFile source;
    CFileException error;
    
    CString lineBuf;
    
    source.Open("C:\\Dokumente und Einstellungen\\weissNichtWieIchHeiss\\Desktop\\test.ini", CFile::modeRead, &error);
    
        if (error.m_cause)
        {
            error.ReportError();
        }
        else
        {
            while (source.ReadString(lineBuf))
            {
                name = lineBuf;
            }
    
            source.Close();
        }
    


  • SUPER DANKE!!!!!!!!!!!!!!!!!!!
    😃 😃 😃 😃 😃 😃 😃
    AAHHHH genial Danke!!!!

    In meinem Stirng stand dann anscheinend:
    C:\\pfaddatei.dat ... da ich das Backslash nach dem letzten Ordner nicht hinzugefügt habe!!!

    Super nochmal vielen Dank, da fällt mir jetzt echt ein RIESEN Stein vom Herzen!!!

    DANKE!
    LG, Ronny



  • hehe kann passieren

    deswegen wie hellsgore sagte

    debuggen

    dann kannst es ja genau sehen 😉

    und PS @ all: nicht immer tausend !!!!!!!! nach jeder zeile verwenden. ist ja keine ebay auktion hier 😉



  • @ronny0815

    [b]tut mir leid das schreiben zu müssen, aber ich denke du kennst das MSDN nur aus dem Forum.
    Ich habe mir deine sämtlichen Beiträge durchgelesen - MSDN - STICHWORT "BLA" hätte gereicht !

    Ich hab einfach reingeguckt - REPLACE gesehen - UND PROBIERT !!!!!

    MIT ERFOLG !


Anmelden zum Antworten