Dlaczego mam problemy rekurencyjnie usuwające katalogi?

Napisałem aplikację, która używa api WIN32 do utworzenia tymczasowej hierarchii katalogów. Teraz, gdy chcesz usunąć katalogi podczas zamykania aplikacji, napotykam problemy.

Powiedzmy, że mam hierarchię katalogów: C: podkatalog katalogu

Używam tej funkcji rekurencyjnej:

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;
}

Ta funkcja iteruje zawartość katalogu katalogu tymczasowego; i dla każdego katalogu w katalogu tymczasowym przywołuje się, dopóki nie znajdzie się w najniższym katalogu; podkatalog w przykładzie.

Zdefiniowano również 3 flagi

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

Używając tej funkcji, usuwa tylko najniższy podkatalog i nie mogę usunąć tych wyższych w hierarchii, ponieważ mówi, że katalog nie jest pusty. Po przejściu do katalogu „podkatalog” jest usuwany dopiero po zakończeniu aplikacji. Jednakże, gdy próbuję hermetyzować to w nierekurencyjnej prostej aplikacji głównej, nie mam żadnych problemów z usuwaniem katalogów.

questionAnswers(7)

yourAnswerToTheQuestion