C/C++: Ordner löschen - Wie geht das



  • 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