AnsiString - Pfadangaben und Doppelbackslash ('\\')



  • Hallo,

    ich würde gern die Backslashes in einem Pfad durch doppelte setzen.

    folgendes funktioniert aber leider nicht:

    {
      String datei = "x:\verzeichnis\datei.txt";
      String alt = "\\";
      String neu = "\\\\";
      datei = StringReplace(datei, alt, neu, [rfReplaceAll]);
      Edit1->Text = "nicht gefunden";
      if (FileExists(datei))
      {
        Edit1->Text = "gefunden";
      }
    }
    

    es kommt eine Fehlermeldung. Leider hat mir die Hilfe auch nicht s richtig
    weitergeholfen, da ich das setzen von Flags scheinbar verstanden.

    Kann mir jemand helfen, diese klitzekleine Problem zu lösen?

    Danke

    [ Dieser Beitrag wurde am 20.07.2002 um 22:44 Uhr von Jansen editiert. ]



  • // alle kommata durch punkte ersetzen
    AnsiString text = "Hallo,,,";
    text            = StringReplace(text, ",", ".", TReplaceFlags() << rfReplaceAll);
    
    // -> text = "Hallo...";
    


  • Danke.....genau das hat mir geholfen. 🙂



  • @Dirk
    Man braucht soetwas nicht zu machen. Wenn man z.B. einen String mit Backslash einliest, dann wird der Backslash intern schohn richtig dargestellt. Nur, wenn du einen BS im Code in einem String haben willst, dann musst du diesen Doppelslash machen, denn sonst würde er den Slash und das darauffolgende Zeichen als Formatierungssequenz ansehen. Z.B. denkt er, dass in "C:\Windows" das \W etwas bestimmtes wie \n bedeutet.
    Ein Backslash in einem String im Code leitet immer eine Formatierungssequenz ein. Um den Backslash doch noch per Code darstellen zu können hat man halt festgelegt, dass das mit "\" zu machen ist. Ich hoffe, das Ganze ist dir jetzt klarer geworden.



  • also bei mir geht leider nur so.

    hier der Code meiner Funktion:

    int TftpFrm::dateiCheck(AnsiString datei)
    { //prüft nach, ob die angegebene Datei bereits im Zielverzeichnis existiert
      String alt = "\\";
      String neu = "\\\\";
      datei = StringReplace(datei, alt, neu, TReplaceFlags() << rfReplaceAll);
      if (FileExists(datei))
      {
        return 1;
      }
      return 0;
    }
    

    und so rufe ich sie auf:

    if (dateiCheck(destination->Text + FTP->FTPDirectoryList->name->Strings[i]) == 1)
      ...
    

    wobei destination->Text ein Edit Feld meines Formulars und die Stringliste ein Listenelement von TNMFTP ist.

    Also lese ich ihn ja von dem Editfeld ein. Nach Deiner Aussage müßte er ja dann korrekt dargestellt sein. Nur leider findet es dann in der Funktion die Datei nicht.

    [ Dieser Beitrag wurde am 20.07.2002 um 22:43 Uhr von Jansen editiert. ]



  • Hast du schon mal überprüft, ob die StringReplace-Funktion überhaupt etwas ersetzt?

    Ich gehe mal davon aus, dass der Benutzer im Edit-Feld immer nur einen Backslash eingibt, wie von Windows gewohnt, oder? In diesem Falle läuft StringReplace in's Leere, weil es keine doppelten Backslashes zu ersetzen gibt.

    Nochmal: solange du Pfadangaben aus Variablen übernimmst brauchst du dich nicht um die Backslashes zu kümmern, das macht der AnsiString intern. Zusätzliche Slashes sind nur dann erforderlich, wenn du direkt in deinem Sourcecode einen Pfad zu stehen hast.

    Hmm, noch so ein FAQ-Thema. 🙂



  • wenn du den pfad über nen Edit einliest, brauchste den nicht zu doppeln, dann reicht ein ...

    if (FileExists(Edit1->Text))
    {
      // gefunden
    }
    

    ... vollkommen aus. der einfache backslash wird intern als \\ geführt und das stringreplace macht dann aus nem pfad wie c:\windows\datei.exe (intern: c:\\windows\\datei.exe) den der user eingibt, ein c:\\\windows\\\datei.exe und das findet er dann nicht.

    sprich der umweg über stringreplace ist eigentlich unnötig.

    // beispiel 1
    new_dir = Edit2->Text;
    
    // bei der eingabe reicht: c:\pfad\db
    if (!new_dir.IsEmpty())
      return Trim(new_dir);
    
    // beispiel 2
    // vorgabe immer mit \\ schreiben!!
    AnsiString pfad = "c:\\pfad\\db";
    
    if (!FileExists(pfad + "\\tabellexyz.db"))
      ShowMessage("TabelleXYZ nicht gefunden!");
    

Anmelden zum Antworten