Warum habe ich Probleme beim rekursiven Löschen von Verzeichnissen?

Ich habe eine Anwendung geschrieben, die die WIN32-API verwendet, um eine temporäre Verzeichnishierarchie zu erstellen. Wenn ich nun die Verzeichnisse beim Beenden der Anwendung löschen möchte, treten einige Probleme auf.

Nehmen wir also an, ich habe eine Verzeichnishierarchie: C: \ temp \ directory \ subdirectory \ Ich benutze diese rekursive Funktion:

Diese Funktion durchläuft den Verzeichnisinhalt des temporären Verzeichnisses. und für jedes Verzeichnis im temporären Verzeichnis ruft es sich immer wieder auf, bis es sich im untersten Verzeichnis befindet; Unterverzeichnis im Beispiel.

bool Dir::deleteDirectory(std::string& directoryname, int flags)
{
    if(directoryname.at(directoryname.size()-1) !=  '\\') directoryname += '\\';

    if ((flags & CONTENTS) == CONTENTS)
    {
        WIN32_FIND_DATAA fdata;
        HANDLE dhandle;

        directoryname += "\\*";
        dhandle = FindFirstFileA(directoryname.c_str(), &fdata);

        // Loop through all the files in the main directory and delete files & make a list of directories
        while(true)
        {
            if(FindNextFileA(dhandle, &fdata))
            {
                std::string filename = fdata.cFileName;
                if(filename.compare("..") != 0)
                {
                    std::string filelocation = directoryname.substr(0, directoryname.size()-2) + StringManip::reverseSlashes(filename);

                    // If we've encountered a directory then recall this function for that specific folder.
                    if(!isDirectory(filelocation))  DeleteFileA(filename.c_str());
                    else deleteDirectory(filelocation, DIRECTORY_AND_CONTENTS);
                }
            } else if(GetLastError() == ERROR_NO_MORE_FILES)    break;
        }
        directoryname = directoryname.substr(0, directoryname.size()-2);
    }

    if ((flags & DIRECTORY) == DIRECTORY)
    {
        HANDLE DirectoryHandle;
        DirectoryHandle = CreateFileA(directoryname.c_str(),
                                FILE_LIST_DIRECTORY,
                                FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                                NULL,
                                OPEN_EXISTING,
                                FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
                                NULL);
        bool DeletionResult = (RemoveDirectoryA(directoryname.c_str()) != 0)?true:false;
        CloseHandle(DirectoryHandle);
        return DeletionResult;
    }

     return true;
}

Es sind auch 3 Flags definiert

Bei Verwendung dieser Funktion wird nur das unterste Unterverzeichnis entfernt, und ich kann keine höheren Unterverzeichnisse in der Hierarchie entfernen, da darin angegeben ist, dass das Verzeichnis nicht leer ist. Wenn ich gehe und in das Verzeichnis 'Unterverzeichnis' schaue, wird es erst nach dem Beenden der Anwendung entfernt. Wenn ich jedoch versuche, dies in einer nicht rekursiven einfachen Hauptanwendung zu kapseln, habe ich überhaupt keine Probleme mit dem Löschen der Verzeichnisse.

 enum DirectoryDeletion
 {
    CONTENTS = 0x1,
    DIRECTORY = 0x2,
    DIRECTORY_AND_CONTENTS = (0x1 | 0x2)
 };

Als ich Ihre Betreffzeile las, dachte ich, Sie versuchten, das Win32-Verzeichnis zu löschen ...

Antworten auf die Frage(7)

Ihre Antwort auf die Frage