码迷,mamicode.com
首页 > 其他好文 > 详细

RemoveDirectory失败 错误代码145

时间:2015-05-30 17:55:07      阅读:1227      评论:0      收藏:0      [点我收藏+]

标签:

今天写一个删除目录的程序(目录下包含子目录),遇到点问题,代码如下:

/////////////////////////////////////////
//    删除目录及子目录下所有文件           //
/////////////////////////////////////////

BOOL DeleteAllFileFromDirectoryW(LPCWSTR lpPath)
{
    HANDLE hFind;
    WCHAR wzDeletePath[MAX_PATH] = { 0 };
    WIN32_FIND_DATA findFileData;
    BOOL bRet = FALSE;

    ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA));
    
    //切换到要删除的路径
    //
    _wchdir(lpPath);

    //检查路径是否以“\”结尾
    //
    wcscpy_s(wzDeletePath, MAX_PATH, lpPath);
    if (L\\ != wzDeletePath[wcslen(wzDeletePath) - 1])
    {
        wcscat_s(wzDeletePath, MAX_PATH, L"\\");
    }

    //在路径后面添加通配符“*.*”
    //
    wcscat_s(wzDeletePath, MAX_PATH, L"*.*");

    //寻找第一个文件
    //
    hFind = FindFirstFileW(wzDeletePath, &findFileData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        //错误提示,路径不存在
        return bRet;
    }

    //开始遍历
    //
    do 
    {
        wcscpy_s(wzDeletePath, MAX_PATH, lpPath);
        wcscat_s(wzDeletePath, MAX_PATH, L"\\");
        wcscat_s(wzDeletePath, MAX_PATH, findFileData.cFileName);

        //如果是目录,过滤掉“.”和“..”目录,递归遍历
        //
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName)))
            {
                continue;
            }

            //递归遍历
            DeleteAllFileFromDirectoryW(wzDeletePath);
        }
        //文件,直接删除
        //
        else
        {
            if (!DeleteFileW(wzDeletePath))
            {
                //错误输出,删除文件失败
                continue;
            }
        }

    } while (FindNextFileW(hFind, &findFileData));

    //文件夹遍历完毕后切换到父文件夹,删除此文件夹
    //
    _wchdir(L"..");
    if (!RemoveDirectoryW(lpPath))
    {
        //错误输出,删除文件夹失败
        return bRet;
    }

    bRet = TRUE;
    return bRet;
}

程序运行后发现总有一些文件夹没删除,当时特别疑惑,就在“RemoveDirectoryW”处打了断点,用GetCurrentDirectoryW函数获取当前路径,用GetLastError观测错误代码

 

技术分享

最后发现在删除一些文件夹失败时,错误代码为145-目录不是空的。此时将程序终止,去查看此目录是否为空,发现确实是空的。奇怪了,每次删除目录前是先切换到父目录呀,而且确实目录下没有文件了呀,郁闷。。

又把程序仔仔细细的看了几遍,去找了文件遍历的例子看了看,忽然发现自己犯了一个二笔的错误,遍历文件后忘记了这句:

 FindClose(hFind);

真是粗心啊,文件搜索的句柄没有关闭导致文件夹无法删除,但是为什么其它文件夹就能删除呢?这个问题就不知道了,反正问题解决了,以后写程序要细心啊,不能犯这种低级错误了。

把正确的代码放到下面,如果你需要参考,别复制错了^_^

/////////////////////////////////////////
//     删除目录及子目录下所有文件         //
/////////////////////////////////////////

BOOL DeleteAllFileFromDirectoryW(LPCWSTR lpPath)
{
    HANDLE hFind;
    WCHAR wzDeletePath[MAX_PATH] = { 0 };
    WIN32_FIND_DATA findFileData;
    BOOL bRet = FALSE;

    ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA));
    
    //切换到要删除的路径
    //
    _wchdir(lpPath);

    //检查路径是否以“\”结尾
    //
    wcscpy_s(wzDeletePath, MAX_PATH, lpPath);
    if (L\\ != wzDeletePath[wcslen(wzDeletePath) - 1])
    {
        wcscat_s(wzDeletePath, MAX_PATH, L"\\");
    }

    //在路径后面添加通配符“*.*”
    //
    wcscat_s(wzDeletePath, MAX_PATH, L"*.*");

    //寻找第一个文件
    //
    hFind = FindFirstFileW(wzDeletePath, &findFileData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        //错误提示,路径不存在
        return bRet;
    }

    //开始遍历
    //
    do 
    {
        wcscpy_s(wzDeletePath, MAX_PATH, lpPath);
        wcscat_s(wzDeletePath, MAX_PATH, L"\\");
        wcscat_s(wzDeletePath, MAX_PATH, findFileData.cFileName);

        //如果是目录,过滤掉“.”和“..”目录,递归遍历
        //
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName)))
            {
                continue;
            }

            //递归遍历
            DeleteAllFileFromDirectoryW(wzDeletePath);
        }
        //文件,直接删除
        //
        else
        {
            if (!DeleteFileW(wzDeletePath))
            {
                //错误输出,删除文件失败
                continue;
            }
        }

    } while (FindNextFileW(hFind, &findFileData));

    FindClose(hFind);

    //文件夹遍历完毕后切换到父文件夹,删除此文件夹
    //
    _wchdir(L"..");
    if (!RemoveDirectoryW(lpPath))
    {
        //错误输出,删除文件夹失败
        return bRet;
    }

    bRet = TRUE;
    return bRet;
}

 

RemoveDirectory失败 错误代码145

标签:

原文地址:http://www.cnblogs.com/danjing/p/4540577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!