c ++ - Hvorfor fjerner fjernbetjeningsfunktionen ikke at slette den øverste mappe?

Indlæg af Hanne Mølgaard Plasc

Problem



henvises til: codeguru.com/forum/showthread.php?t=239271


Når du bruger funktionen herunder til at slette mapper, bliver alle mapper, undermapper og filer slettet, med undtagelse af den øverste mappe. Sig til stien c:folder1folder2 alt under folder2 slettes, undtagen for folder2.


BOOL DeleteDirectory(const TCHAR* sPath)  
{  
    HANDLE hFind; // file handle
    WIN32\_FIND\_DATA FindFileData;

    TCHAR DirPath[MAX\_PATH];
    TCHAR FileName[MAX\_PATH];

    \_tcscpy(DirPath,sPath);
    \_tcscat(DirPath,\_T("\"));
    \_tcscpy(FileName,sPath);
    \_tcscat(FileName,\_T("\*")); // searching all files
    int nRet = 0;
    hFind = FindFirstFile(FileName, &FindFileData); // find the first file
    if( hFind != INVALID\_HANDLE\_VALUE ) 
    {
        do
        {
            if( IsDots(FindFileData.cFileName) ) 
                continue; //if not directory continue

            \_tcscpy(FileName + \_tcslen(DirPath), FindFileData.cFileName);
            if((FindFileData.dwFileAttributes & FILE\_ATTRIBUTE\_DIRECTORY)) 
            {
                // we have found a directory, recurse
                if( !DeleteDirectory(FileName) ) 
                    break;   // directory couldn't be deleted
            }
            else 
            {
                if(FindFileData.dwFileAttributes & FILE\_ATTRIBUTE\_READONLY)
                    \_wchmod(FileName, \_S\_IWRITE); // change read-only file mode

                if( !DeleteFile(FileName) ) 
                    break;  // file couldn't be deleted
            }
        }while( FindNextFile(hFind, &FindFileData) );

        nRet = FindClose(hFind); // closing file handle
    }

    return RemoveDirectory(sPath); // remove the empty (maybe not) directory and returns zero when RemoveDirectory function fails
}  


Enhver hjælp til at finde problemet er værdsat.
Under fejlfinding bemærkede jeg, at FindClose -funktionen lukkede filhåndtaget korrekt, men GetLastError vendte tilbage 32 ('Processen kan ikke få adgang til filen, fordi den bruges af en anden proces') Men jeg har ingen anelse efter forsøg med proces explorer.

Bedste reference


Mens du kan slette en mappe på denne måde, er det nemmere at lade systemet gøre det for dig ved at kalde SHFileOperation forbi FO\_DELETE. Husk at du skal fordoble den streng, du overleverer til denne API . [10]

Andre referencer 1


Jeg tror, ​​at du skal lukke filhåndtaget inden det rekursive opkald. Hvilket betyder, at efter at have slukket det rekursive opkald, skal du igen sætte dit filhåndtag til noget passende.


SHFileOperation kan være en bedre løsning; Jeg svarer bare på OPs spørgsmål om, hvorfor deres kode ikke fungerede som beregnet.

Andre referencer 2


Se: http://www.codeguru.com/forum/archive/index.php/t-337897.html

Nedenfor er koden til at slette bibliotek ved hjælp af SHFileOperation


bool DeleteDirectory(LPCTSTR lpszDir, bool noRecycleBin = true)
{
    int len = \_tcslen(lpszDir);
    TCHAR* pszFrom = new TCHAR[len+4]; //4 to handle wide char
    //\_tcscpy(pszFrom, lpszDir); //todo:remove warning//;//convet wchar to char*
    wcscpy\_s (pszFrom, len+2, lpszDir);
    pszFrom[len] = 0;
    pszFrom[len+1] = 0;

    SHFILEOPSTRUCT fileop;
    fileop.hwnd   = NULL;    // no status display
    fileop.wFunc  = FO\_DELETE;  // delete operation
    fileop.pFrom  = pszFrom;  // source file name as double null terminated string
    fileop.pTo    = NULL;    // no destination needed
    fileop.fFlags = FOF\_NOCONFIRMATION|FOF\_SILENT;  // do not prompt the user

    if(!noRecycleBin)
        fileop.fFlags |= FOF\_ALLOWUNDO;

    fileop.fAnyOperationsAborted = FALSE;
    fileop.lpszProgressTitle     = NULL;
    fileop.hNameMappings         = NULL;

    int ret = SHFileOperation(&fileop); //SHFileOperation returns zero if successful; otherwise nonzero 
    delete [] pszFrom;  
    return (0 == ret);
}