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 DateiendungPS: 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.txtIch 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.txtVielleicht 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.