Warum habe ich Probleme, rekursiv Verzeichnisse löschen?

Ich habe eine Anwendung geschrieben, verwendet die WIN32-api zum erstellen von einem temporär-Verzeichnis-Hierarchie. Nun, wenn Sie wollen löschen Sie die Verzeichnisse, die beim Herunterfahren der Anwendung, die ich laufen in einige Probleme.

So können sagen, ich habe eine directory-Hierarchie: C:\temp\directory\subdirectory\

Ich bin mit dieser rekursiven Funktion:

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

Diese Funktion iteriert über das Verzeichnis den Inhalt des temp-Verzeichnis und für jedes Verzeichnis im temp-Verzeichnis behält er erinnert sich, bis es auf der untersten Verzeichnis; ein Unterverzeichnis im Beispiel.

Außerdem gibt es 3 flags definiert

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

Wenn Sie mit dieser Funktion, es entfernt nur die niedrigsten Unterverzeichnis, und ich kann nicht entfernen Sie die, die höher in der Hierarchie, weil es sagt, dass das Verzeichnis nicht leer ist. Wenn ich gehen und schauen Sie in das Verzeichnis 'Verzeichnis' ist nur entfernt werden, nachdem die Anwendung beendet. Jedoch, wenn ich versuche, diese Kapseln in eine nicht rekursive einfache main-Anwendung habe ich überhaupt keine Probleme mit dem löschen der Verzeichnisse.

  • als ich das gelesen im Betreff, ich dachte, Sie wollten versuchen, löschen win32-Verzeichnis...
InformationsquelleAutor Charles | 2009-09-23
Schreibe einen Kommentar