Rekrusives löschen von Dateien
-
Ich habe heute den ganzen Tag damit verbracht eine Methode zu finden um mit findNextFile eine Funktion zu schreiben oder Funktionen die rekrusiv Dateien löschen kann. Jetzt glaube ich dass das Prinzip stimmt aber ich habe einen komischen Laufzeitfehler den ich nicht ganz verstehe.
Der Fehler tritt in Zeile 79 auf. Das Programm kann kompiliert werden aber bei dieser Zeile Stürzt es ab.
1.) Könnte mir wer sagen ob und wie ich mein Programm besser machen könnte
2.) Warum habe ich diesen Fehler#include <iostream> #include <windows.h> #include <fstream> #include <string.h> #include <algorithm> using namespace std; char directory[100]; bool isLastDirectory(char directoryBuffer[100]) { WIN32_FIND_DATA wfd; HANDLE fileHandle; fileHandle = FindFirstFile(directoryBuffer, &wfd); do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { return false; } } }while(FindNextFile(fileHandle,&wfd)); FindClose(fileHandle); return true; } void deleteFiles(char directoryBuffer[100]) { WIN32_FIND_DATA wfd; HANDLE fileHandle; fileHandle = FindFirstFile(directoryBuffer, &wfd); char removeFile[100]; do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { strcpy(removeFile,directoryBuffer); strtok(removeFile, "*"); sprintf(removeFile, "%s\%s",removeFile, &wfd.cFileName); remove(removeFile); cout << "Datei: " << removeFile << " wurde geloescht" << endl; } }while(FindNextFile(fileHandle,&wfd)); FindClose(fileHandle); } void myDelete(char directoryBuffer[100]) //Fehler in Funktion { WIN32_FIND_DATA wfd; HANDLE fileHandle; bool weiter; char removeFile[100]; fileHandle = FindFirstFile(directoryBuffer, &wfd); do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { strtok(directoryBuffer, "*"); sprintf(directoryBuffer, "%s\%s\\*",directoryBuffer, &wfd.cFileName); if(isLastDirectory(directoryBuffer)) { cout << "Die letzte directory: " << directoryBuffer << endl; deleteFiles(directoryBuffer); RemoveDirectory(directoryBuffer); directoryBuffer = directory; } else { myDelete(directoryBuffer); } } else { strcpy(removeFile,directoryBuffer); strtok(removeFile, "*"); sprintf(removeFile, "%s\%s",removeFile, &wfd.cFileName); remove(removeFile); cout << "Datei: " << removeFile << " wurde geloescht" << endl; } } }while(FindNextFile(fileHandle,&wfd)); FindClose(fileHandle); } int main(int argc, TCHAR *argv[]) { strcpy(directory, "C:\\Dokumente und Einstellungen\\Matthias\\Eigene Dateien\\Meine empfangenen Dateien\\*"); char directoryBuffer[100]; strcpy(directoryBuffer, directory); myDelete(directoryBuffer); return 0; }
-
Warum nicht "SHFileOperation"?
Für was brauchst Du die globale Variable "fileName"?
Was hast Du mit "strtok" auf einem schreibgeschützten String vor?
Warum machst Du zweimal Find...?
-
Die 2 finds brauche ich. Also das Programm funktioniert so. Es geht mit der 1ten findFunktion bis in das letzte Unterverzeichnis. In dem löscht es dann alle Dateien (2te findFunktion). Da es das letzte ist sind auch keine Unterverzeichnisse mehr darin vorhanden. Also lösche ich dieses Verzeichnis. Anschließend fängt wieder alles von vorne an. Jetzt ist aba das Verzeichnis von vorhin gelöscht. So löscht es alle hintereinander. Wenn ich z.B.: nur eine Suchfunktion habe. dann kann es alle Dateien nur einmal durchgehen. Das heißt wenn es 2. Unterordner im gleichen Verzeichnis gibt. Kann ich nur die erste löschen.
Das mit dem schreibgeschützten String. Wieso ist der Schreibgeschützt. Ist doch nirgends const angelegt. Ja kannst mir dafür eine Lösung geben bitte.
-
Jochen Kalmbach schrieb:
Warum nicht "SHFileOperation"?
Ich wollte es selber programmieren. Bei SHFileOperation ist nicht viel dahinter die paar Zeilen zu schreiben. Und vielleicht nehme ich auch die Funktion, weil sie wahrscheinlich schneller ist. WOllte aber doch mal selber probieren
-
reuabreliz schrieb:
Das mit dem schreibgeschützten String. Wieso ist der Schreibgeschützt. Ist doch nirgends const angelegt. Ja kannst mir dafür eine Lösung geben bitte.
reuabreliz schrieb:
char *fileNameBuffer = fileName = "C:\\Dokumente und Einstellungen\\Matthias\\Eigene Dateien\\Meine empfangenen Dateien\\*";"..."ist ein String-Literal auf den Deine beiden Pointer Zeigen. Literale kannst Du nicht ändern. Du willst wahrscheinlich ein char-Array:char fileNameBuffer[ ] = "C:\\Dokumente und Einstellungen\\Matthias\\Eigene Dateien\\Meine empfangenen Dateien\\*";greetz, Swordfish
-
Swordfish schrieb:
"..."ist ein String-Literal auf den Deine beiden Pointer Zeigen. Literale kannst Du nicht ändern. Du willst wahrscheinlich ein char-Array:char fileNameBuffer[ ] = "C:\\Dokumente und Einstellungen\\Matthias\\Eigene Dateien\\Meine empfangenen Dateien\\*";greetz, Swordfish
Ja aba wenn ich das so Mache dann kann ich nichts dranhengen. z.b.: dateiname. WEil das Array auf diesen String beschränkt ist oder?
-
Hey danke es ist wirklich an den blöden Zeigern gelegen. Nächste Mal arbeite ich mit der Klasse string da muss ich nicht aufpassen

-
reuabreliz schrieb:
Nächste Mal arbeite ich mit der Klasse string da muss ich nicht aufpassen

Brav!

greetz, Swordfish
-
Nein, böse... std::strin gist nicht TCHAR-aware...
-
Sein jetztiger Code ist auch nicht
TCHAR-aware... Dann vielleichtstd::basic_string< TCHAR >?greetz, Swordfish
-
SO ich habe jetzt den Code noch einmal aktualisiert. Die jetzige Version funktioniert nur teilweise.
Also ich habe mir einen Ordner angelegt in diesem Ordner sind 4 Textdokumente und ein Unterverzeichnis. In dem Unterverzeichnis befindet sich noch ein Unterverzeichnis und noch 4 weitere Textdateien. Die habe ich angelegt um zu testen ob mein Programm auch wirklich alle löscht.
Wenn ich das Programm ausführe:
Also im ersten Ordner löscht es ja noch die Dateien. Bis es ein Unterverzeichnis findet. Meine Funktion hüpft dann in das Unterverzeichnis und ruft sich dann selber noch einmal auf. Das heißt es macht ein neues FileHandle und löscht solange Dateien bis ein neues Unterverzeichnis kommt. Wenn es kein Unterverzeichnis mehr geben sollte löscht es alle Dateien in dem Verzeichnis + das Verzeichnis in dem sich ja nun keine Dateien mehr befinden und geht wieder ins Startverzeichnis. Dann wiederholt sich alles. Bis keine Unterverzeichnisse mehr vorhanden sind und alle Dateien gelöscht sind.der Fehler:
Aber sobald er in das 1. Unterverzeichnis springt, das heißt in meinem Programm wird mydelete von sich selbst noch einmal aufgerufen stürtzt das Programm beim nächsten findNextFile ab. Ich habe keine Ahnung wieso. Von der Überlegung wie mein Programm löscht sollte alles stimmen.Würde mich sehr über Hilfe freuen