C/C++: Ordner löschen - Wie geht das
-
Hallo,
ich suche nach einer Möglichkeit (auf Windowsbasis) Ordner mithilfe der Winapi zu löschen. Dateien kann man einfach mit DeleteFileA(LPCSTR) löschen. Aber wie geht das mit Ordnern? Zum scannen verwende ich die C Struktur WIN32_FIND_DATA und kann damit auch den Ordnernamen ermitteln.
Mfg
Alpha_Coder
-
Also entweder schreibst du eine eigene Funktion DeleteDir(const char* name), die alle Dateien im Ordner löscht und sich bei Ordnern selber aufruft (Rekursion), oder du nimmst die vorgefertigte Funktion SHFileOperation, die für so etwas gedacht ist.
-
Irgendwie komme ich mit SHFileOperation nicht ganz klar. Der MSDN Artikel ist nicht sehr hilfreich. Kann mir jemand ein kleines Beispiel geben? (zum löschen eines Verzeichnisses und deren enthaltenen Dateien)
Mfg
Alpha_Coder
-
Probiers mal mit boost::filesystem.
Ist auch portabel
-
Und wenn er in C programmiert, überhaupt nicht daran interessiert ist, portablen Code zu erzeugen oder sich für eine solche Minifunktionalität nicht boost herunterladen und darin einarbeiten will?
In den MSDN-Artikeln steht (wie eigentlich immer) alles Nötige, um die Funktionen nutzen zu können. Woran hapert es denn?
Denk daran, dass der Verzeichnisname doppelt nullterminiert werden muss, nachzulesen bei der Beschreibung der Struktur.
-
Im Titel steht aber C++.
Und da die meisten C++-Anwender durchaus Boost auf der Platte haben, ist es durchaus eine Option. Warum mit C rumquälen wenn es eine saubere, portable C++ Lösung gibt.
Ich finde ein
boost::filesystem::remove_all("C:\testdir");
deutlich angenehmer als WinAPI-Gefrickel, das nicht sein müsste.
-
Ungetestetes Beispiel:
SHFILEOPSTRUCT sop; ZeroMemory(&sop,sizeof(SHFILEOPSTRUCT)); // Erstmal alle sop-Member leeren sop.wFunc=FO_DELETE; // Wir wollen löschen sop.pFrom=TEXT("c:\\test\\delme\0"); // \0 hinten dran ist wichtig! SHFileOperation(&sop);
-
Bin hoffentlich nicht zu spät dran. Wollte nur sagen, dass die konservative Variante gar nicht so schwer zu implementieren ist:
void DeleteDir (char *pszDir) { WIN32_FIND_DATA tData = {0}; char pszFile[MAX_PATH] = {0}; char pszMask[MAX_PATH] = {0}; HANDLE hFind = NULL; // Suchmaske generieren ::StringCbPrintf (pszMask, sizeof (pszMask), "%s\\*.*", pszDir); // Dateien löschen hFind = ::FindFirstFile (pszMask, &tData); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(tData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { ::StringCbPrintf (pszFile, sizeof (pszFile), "%s\\%s", pszDir, tData.cFileName); ::DeleteFile (pszFile); } } while (::FindNextFile (hFind, &tData)); // Suche beenden ::FindClose (hFind); } // Verzeichnis löschen ::RemoveDirectory (pszDir); }
-
Toll - hoffen wir, daß das Verzeichnis nicht weitere Verzeichnisse enthält ...
-
Noch ein sehr simpler Vorschlag: Eine Batchdatei killfolder.bat erstellen und diese mit system("killfolder.bat"); aufrufen. Man braucht nur die OS-Befehle aus command.com. Sollte man zuvor von der Eingabeaufforderung mit einem Dummy-Ordner ausprobieren!
-
Vielen Dank. Das war genau das, was ich gesucht habe.
Mfg
Alpha_Coder
-
Das ist nicht simpel. Simpel ist die Benutzung von SHFileOperations, eine API-Funktion, die genau für diese Zwecke da ist.
-
Belli schrieb:
Das ist nicht simpel. Simpel ist die Benutzung von SHFileOperations, eine API-Funktion, die genau für diese Zwecke da ist.