"C:\Datei.mp3" zu "C:\\Datei.mp3" ohne String zu zerpflücken



  • So, nabend leutz...
    Ich habe ein ein Problem beim abspielen von Sounds über MCI. Ich lasse über nen OpenDialog die entsprechende Datei in ein Textfeld schreiben. Wenn ich jetzt auf Play drücke, holt er sich den Text aus dem Feld, und soll ihn über MCI abspielen. Allerdings gibt mcisendstring 0 zurück, also fehlgeschlagen. Ich habe durch testen auch schon herausgefunden, dass das daran liegt, dass wenn ich zum Beispiel diese Datei nehme: "C:\Datei.mp3" den Backslash eben als Escape-Zeichen ansieht. Also damit es funktioniert muss ich das machen: "C:\\Datei.mp3". Allerdings wird beim OpenDialog immer nur die erste Variante genommen, das heißt ich muss vor den Backslash noch einen schreiben. Jetzt meine Frage: Kann ich das irgendwie machen, ohne das ich den String auseinandernehmen muss? Ich habe das schonmal irgendwie hinbekommen, allerdings habe ich das Programm ziemlich schnell wieder gelöscht, da ich nur sehen wollte wie mcisendstring arbeitet...

    DIV Escaped



  • Hmm der öffnen Dialog macht das eigentlich richtig...glaub das liegt an was anderem :p ...

    Naja so kann mans auf jeden Fall machen:

    #include <String>
    using namespace std;
    
    // Initialisierung... via 'Öffnen-Dialog' und Übergabe an std::string-Objekt Konstruktor:
    string strSrc(...);
    unsigned int uiOffset = 0;
    while((uiOffset = strSrc.find('\', uiOffset)) != string::npos)
    {
       strSrc.insert('\', uiOffset);
       ++uiOffset;
    }
    

    Habs aber nit getestet... 🤡



  • Wie hast du es getestet,dass da nur ein '\' ist?



  • #include <string>
    
    std::string strSrc(...);
    unsigned int uiOffset     = 0;
    unsigned int uiLastOffset = 0;
    while((uiOffset = strSrc.find('\', uiOffset)) != string::npos)
    {
       if ((uiOffset - 1) != uiLastOffset)
       {
           strSrc.insert('\', uiOffset);
           uiLastOffset = uiOffset;
       }
       ++uiOffset;
    }
    

    Davon ausgehend das CodeFinder's Code stimmt ...



  • Escaped, das glaub ich dir nicht.

    DIV.



  • Da wird nichts escaped... Escapezeichen werden zur Kompilierzeit ausgewertet.



  • Nanyuki schrieb:

    Da wird nichts escaped... Escapezeichen werden zur Kompilierzeit ausgewertet.

    Stimmt. Aber damits jeder versteht:

    Den Doppelbacklash brauchst du nur, wenn du Text mit Anführungszeichen in deinen Quellcode schreibst.

    char* Str = "C:\\Datei.mp3"; // In Str steht jetzt 'C:\Datei.mp3'
    

    Wenn in deinem String sowieso schon 'C:\Datei.mp3' drinsteht, dann lass es so, das ist schließlich der gültige Dateiname. Mit 'C:\\Datei.mp3' kann dein Dateisystem nichts anfangen!

    Du musst unterscheiden zwischen dem, was im String drinsteht und dem, was du als konstanten Text in deinem Quellcode schreibst á lá "C:\...".
    Bevor dein Programm zu einer Exe-Datei (bzw Dll) zusammengebastelt wird, ersetzt der Compiler alle "\" in reingeschriebenem Text zu "\".

    Das Ganze hat den Sinn, dass du Zeichen wie '\r' und '\n' ausdrücken kannst. '\r' wird zum Carriage-Return-Zeichen. Das geht aber nur, wenn das alleinstehende Zeichen '\' keine Bedeutung hat, denn sonst würde im String wortwörtlich '\r' (Backslash und dann ein r) drinstehen. Damit man den Backslash aber auch in seine Zeichenketten einbauen kann, drückt man einen Backslash mit '\' aus.

    Was aber schon in einer Variable irgendwo im Arbeitsspeicher drinsteht, das interessiert niemanden. Da steht ein einzelner Backslash auch nur für einen einzelnen Backslash. Und das Carriage-Return-Zeichen steht in der String-Variable auch nicht als zwei Buchstaben (\r), sondern als ein einzelnes Zeichen mit dem Wert 10.



  • du musst aber glaub ich hinten und vorne ein backslash hinmachen damit du auch dateinamen mit leerzeichen drin benutzen kannst.



  • ach sorry ich meinte nicht backslash sondern "



  • Hier geht's nicht um Shell.



  • mciSendString muss aber wissen was zum dateinamen gehört und was die optionen sind



  • Also WENN ein Dateinamen Leerzeichen enthält, MUSST du den mit doppelten Anführungszeichen 'umranden'.

    Im Quellcode also mit:

    \"C:\\Meine Musik\\Ein anderer Ordner\\beispiel_datei.mp3\"
    

    (Siehe dazu auch noch einmal Badestrand's gute Erläuterung bzgl. Escape-Sequenzen 😉 )



  • Sry, dass ich mich so spät erst wieder melde. Also der Dateiname besitzt Leerzeichen.
    @Badestrand: Scheinbar sieht das mciSendString nicht so. denn wenn ich in den Quellcode "C:\datei.mp3" schreibe, dann sagt er, dass er die nicht abspielen kann. Wnn ich aber "C:\\datei.mp3" schreibe, dann macht er keine Probleme. Das macht er auch, wenn ich das in eine Variable schreibe.



  • @Escaped:
    Huh?!, Hast du Badestrands Post überhaupt verstanden ?!

    Escaped schrieb:

    Also der Dateiname besitzt Leerzeichen

    Haste jetzt mal Anführungszeichen gesetzt ?



  • CodeFinder schrieb:

    @Escaped:
    Huh?!, Hast du Badestrands Post überhaupt verstanden ?!

    Anscheinend nicht 🙄

    Alles umsonst geschrieben^^



  • Escaped schrieb:

    Sry, dass ich mich so spät erst wieder melde. Also der Dateiname besitzt Leerzeichen.
    @Badestrand: Scheinbar sieht das mciSendString nicht so. denn wenn ich in den Quellcode "C:\datei.mp3" schreibe, dann sagt er, dass er die nicht abspielen kann. Wnn ich aber "C:\\datei.mp3" schreibe, dann macht er keine Probleme. Das macht er auch, wenn ich das in eine Variable schreibe.

    Klar wenn du den String in den Quellcode schreibst brauchst du das. Ansonsten nicht.



  • pfad zur satein im quelltext:
    "C:\\Music File.mp3"
    pfad geholt durch dialog:
    "C:\Music File.mp3"

    eigentlich ganz einfach #gg

    schonmal GetLastError gemacht ?



  • So wieder da.
    Ja ich hzabe 'Badestrands Post glesen, verstanden und sonst was eben. Allerdings ändert das leider nichts am Problem, weshalb ich darauf nicht näher eingegangen bin. GetLastError () habe ich noch nicht probiert, wird aber glaube ich auch nichts bringen...



  • läuft es denn bei dateien ohne leerzeichen im dateinamen?


Anmelden zum Antworten