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.


  • Mod

    Belli schrieb:

    Das ist nicht simpel. Simpel ist die Benutzung von SHFileOperations, eine API-Funktion, die genau für diese Zwecke da ist.

    👍


Anmelden zum Antworten