¿Por qué tengo problemas para eliminar directorios de forma recursiva?

He escrito una aplicación que utiliza la api de WIN32 para crear una jerarquía de directorios temporalmente. Ahora, al querer eliminar los directorios al cerrar la aplicación me estoy encontrando con algunos problemas.

Así que digamos que tengo una jerarquía de directorios: C: \ temp \ directory \ subdirectory \ Estoy usando esta función recursiva:

Esta función recorre el contenido del directorio del directorio temporal; y para cada directorio en el directorio temporal se sigue recordando hasta que está en el directorio más bajo; subdirectorio en el ejemplo.

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

También hay 3 banderas definidas.

Al usar esta función, solo elimina el subdirectorio más bajo y no puedo eliminar los más altos en la jerarquía porque dice que el directorio no está vacío. Cuando voy y veo el directorio, el 'subdirectorio' solo se elimina después de que finaliza la aplicación. Sin embargo, cuando trato de encapsular esto en una aplicación principal simple no recursiva no tengo ningún problema en absoluto al eliminar los directorios.

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

cuando leí su línea de asunto, pensé que estaba intentando eliminar el directorio win32 ...

Respuestas a la pregunta(7)

Su respuesta a la pregunta