Почему у меня возникают проблемы с рекурсивным удалением каталогов?

Я написал приложение, которое использует API-интерфейс WIN32 для создания временной иерархии каталогов. Теперь, когда я хочу удалить каталоги при закрытии приложения, я сталкиваюсь с некоторыми проблемами.

Допустим, у меня есть иерархия каталогов: C: \ temp \ directory \ subdirectory \ Я использую эту рекурсивную функцию:

Эта функция перебирает содержимое каталога временного каталога; и для каждого каталога во временном каталоге он продолжает вызывать себя, пока не окажется в самом низком каталоге; подкаталог в примере.

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

Также определены 3 флага

При использовании этой функции она удаляет только самый нижний подкаталог, и я не могу удалить те, которые находятся выше в иерархии, потому что он говорит, что каталог не пустой. Когда я иду и смотрю в каталог, «подкаталог» удаляется только после завершения приложения. Однако, когда я пытаюсь инкапсулировать это в нерекурсивное простое основное приложение, у меня нет проблем с удалением каталогов.

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

когда я прочитал вашу тему, я подумал, что вы пытаетесь удалить каталог win32 ...

Ответы на вопрос(7)

Ваш ответ на вопрос