Unterschiedliche Dateien gleichen Namens verknüpfen?



  • Hallo zusammen,
    Ich habe folgendes Problem:
    Ich habe eine nicht-rekursive Suchfunktion, die mir alle Dateien test*.txt ausgibt. Nachdem ich den Inhalt jeder gefundenen Datei auslesen lasse und mit einem String vergleiche, lösche ich bei erfolgreichem Vergleich die Datei (mit remove() Funktion).
    Soweit so gut, jetzt möchte ich aber eine Datei gleichen Namens test*.xyz automatisch mitlöschen lassen. D.h. immer wenn mein Vergleich Erfolg hat soll z.B. test3.txt und test3.xyz gemeinsam glöscht werden. Die Dateien liegen alle im gleichen Ordner, der Inhalt der Dateien ist jedoch vollkommen verschieden.
    Sollte Code gewünscht sein kann ich den gerne noch posten, aber vielleicht weiß ja auch so schon jemand eine Möglichkeit.

    Thx

    Nebenbei, dass ganze läuft als Konsolenanwendung auf einem W2K Rechner mit VS 2005 Prof.



  • Du hast doch den Dateinamen (als string, hoffe ich) -also mußt du nur noch die Dateiendung herausfinden (rfind('.')), ersetzen und den angepassten Dateinamen ebenfalls an remove() übergeben.



  • Das klingt zwar einfach, ich weiß aber überhaupt nicht an welcher Stelle ich rfind einsetzen soll. Ich vermut mal hier irgendwo:

    //    Prototypen
    void dirsearch(char[], const string&, const string&, vector<string>&);
    bool read_line(char[], const string&, const string&, string&);
    void loeschen (char[], const string&, string&, const string&, const string&);
    
    //Auszug aus der main
    ...
    dirsearch(root, inf, "test*.*", files);
    
    for(vector<string>::iterator p=files.begin();p!=files.end();++p) //in p 
      {
        if(read_line(root, inf, *p, line) == false)
        {
          cout << ...
        }
        else
          {
            loeschen(root, inf, line, "xyz", *p);
          }
      }
    

    Ansonsten sag mir bitte welche Funktion du brauchst um mir zu helfen. Das mit dem ersetzen der Endung stellt mich auch vor Probleme, die übergabe sollte ich hinbekommen 😉 (hoffentlich)



  • Erstmal solltest du dazuschreiben, welche Bedeutung die einzelnen Parameter haben (die ersten beiden Funktionen kommen mir bekannt vor ;)).

    Ansonsten:

    string filename = "C:\test.txt";
    size_t p = filename.rfind('.');
    if(p==string::npos)
      filename+=".xyz";//bisher keine Dateiendung - neue Endung anhängen
    else
      filename.replace(p,string::npos,".xyz");//Ersetze bisherige Dateiendung
    

    PS: Den ersten Parameter der Funktionen solltest du auch als (const) string& übergeben



  • die ersten beiden Funktionen kommen mir bekannt vor

    😃 naja du beantwortest nicht zum ersten Mal eine meiner Fragen.

    Den ersten Parameter der Funktionen solltest du auch als (const) string& übergeben

    Hab ich versucht, allerdings steckt da das Win Verzeichnis dahinter, welches ich mit

    GetWindowsDirectory(root, MAX_PATH)
    

    ermittle. Anscheinend lässt sich root dann nur als char Array übergeben, ansonsten hab ich noch keinen Weg gefunden.

    Zu den Parametern/ Variablen:

    root = char root[MAX_PATH];     // Bsp. C:\Winnt
    inf  = const string inf = "\\Ordner\\";    //erklärt sich von selbst
    line = string line;                 // Inhalt wird über getline() ermittelt 
    files = vector<string> files;       // Dateiname wird darin gespeichert z.B. test.txt
    

    Ich hab immer noch das Prob, dass ich nicht weiß an welcher Stelle ich das ganze einbauen soll 😞 Ich probier noch ein bisschen weiter, aber wäre auch sehr glücklich über eine Antwort, da ich mich jetzt schon länger damit bechäftige.
    Dankeschön



  • ITAzubi23 schrieb:

    die ersten beiden Funktionen kommen mir bekannt vor

    😃 naja du beantwortest nicht zum ersten Mal eine meiner Fragen.

    Den ersten Parameter der Funktionen solltest du auch als (const) string& übergeben

    Hab ich versucht, allerdings steckt da das Win Verzeichnis dahinter, welches ich mit

    GetWindowsDirectory(root, MAX_PATH)
    

    ermittle. Anscheinend lässt sich root dann nur als char Array übergeben, ansonsten hab ich noch keinen Weg gefunden.

    Versucht eine deiner Funktionen, GetWindowDirectory() aufzurufen? Soweit ich das in Erinnerung habe, gibst du das Wurzelverzeichnis von außen mit - und da ist es sicherer (und einfacher), einen string zu verwenden.

    Zu den Parametern/ Variablen:

    root = char root[MAX_PATH];     // Bsp. C:\Winnt
    inf  = const string inf = "\\Ordner\\";    //erklärt sich von selbst
    line = string line;                 // Inhalt wird über getline() ermittelt 
    files = vector<string> files;       // Dateiname wird darin gespeichert z.B. test.txt
    

    Vielleicht solltest du mir doch mal die loeschen()-Funktion zeigen. (vor allem, wozu benötigt sie die ganzen Parameter?)

    Ich hab immer noch das Prob, dass ich nicht weiß an welcher Stelle ich das ganze einbauen soll 😞 Ich probier noch ein bisschen weiter, aber wäre auch sehr glücklich über eine Antwort, da ich mich jetzt schon länger damit bechäftige.

    Ich würde der loeschen()-Funktion nur einen Parameter übergeben - den Namen der zu löschenden Datei (wenn es überhaupt nötig ist, dafür eine eigene Funktion zu schreiben).
    Und dann kannst du es so einbauen:

    if(read_line(root, inf, *p, line) == false)
    {
      cout << ...
    }
    else
    {
      remove(p->c_str());//Lösche .txt Datei
    
      //Namen der zweiten Datei zusammenbauen
      size_t p = p->rfind('.');
      if(p==string::npos)
        *p+=".xyz";
      else
        p->replace(p,string::npos,".xyz");
    
      remove(p->c_str());//Lösche zweite Datei
    }
    


  • Du wirst lachen, aber genau das probier ich gerade aus, trotzdem danke.
    Die Loeschfunktion hab ich nur ausgelagert, weil sie neben der remove Funktion auch eine switch Abfrage durchführt und einiges an Ausgaben macht(ich wollte das nicht alles in der main stehen haben).
    Ich meld mich wenns trotz Allem nicht läuft, ansonsten vielen Dank mal wieder CStoll.


Anmelden zum Antworten