两个本身函数建立目录和删除目录,考虑了多级目录的状况

  使用shell api的话删除目录和建立目录都是很是简单的一个函数调用就能够,可是若是是使用为win32里面基本的函数的话,就稍微会复杂点。不过我的感受shell api里面删除和建立目录的函数也是调用win32里面这些基本的函数。shell

  建立目录, 能够建立多级目录,代码拷过去稍稍修改可用:api

int IPath::SetDirectory(LPCTSTR lptStr)
{

    _stprintf_s(IPath::s_tszPath, _T("%s"), lptStr );
    char* szPath=NULL;
    W2C(&szPath, lptStr);
    strcpy_s(IPath::s_szPath, szPath);
    SAFE_ARRYDELETE(szPath);

    //TCHAR* tszPath = IPath::s_tszPath;
    TCHAR tszPath[MAX_PATH] = {0x0};
    _tcscpy_s(tszPath, IPath::s_tszPath);
    TCHAR* ptszTok = _tcstok(tszPath, _T("\\"));

    TCHAR tszTempPath[MAX_PATH] = {'\0'};

    while(ptszTok != NULL)
    {
        int pos = 0; //记录当前文件上一次目录结束位置(字符串中)
        if (tszTempPath[0] == '\0')
        {
            _tcscpy_s(tszTempPath, ptszTok);
        }
        else
        {
            pos = _tcslen(tszTempPath);
            _stprintf_s(tszTempPath, _T("%s\\%s"), tszTempPath, ptszTok);
        }
    

        //res 0: 文件存在,
        //      1:建立成功 
        //      -1:建立失败
        int res = 0; 
        if (!CreateDirectory(tszTempPath, NULL))
        {
            if (GetLastError() == ERROR_ALREADY_EXISTS)
                //文件夹已经存在
                res = 0;
            else
                //建立失败
                res = -1;
        }
        else
            res = 1;

        if (res >= 0)
        {
            //建立成功 或者文件存在
            ptszTok =  _tcstok(NULL, _T("\\"));
        }
        else
        {
            //建立失败后 处理能够 删除 以前已经建立的
            tszTempPath[pos] = '\0';
            RemoveDirectory(tszTempPath);
            return DB_FAILED;
            
        }
    }

    return DB_OK;

}

 

  删除目录,RemoveDirectory函数只能删除空文件夹, 因此伤处文件夹以前必须删除其子文件夹和文件,下面代码使用递归方法:函数

BOOL IPath::DeleteFolder(LPCTSTR lpstrFolder)
{
    TCHAR tszFind[MAX_PATH] = {0x0};
    WIN32_FIND_DATA wfd;
    BOOL bRet ;
    _tcscpy_s(tszFind, MAX_PATH, lpstrFolder);
    _tcscat_s(tszFind, _T("\\*.*"));

    HANDLE hFind  = FindFirstFile(tszFind, &wfd);

    if (INVALID_HANDLE_VALUE == hFind)
    {
        return FALSE;
    }
    bRet = TRUE;
    //遍历文件夹进行删除
    while (bRet)
    {
        bRet = FindNextFile(hFind, &wfd);
        //不是当前目录或者父目录
        if (!bRet)
        {
            break;
        }
        _tcscpy_s(tszFind, MAX_PATH, lpstrFolder);
        _tcscat_s(tszFind, _T("\\"));
        _tcscat_s(tszFind, wfd.cFileName);

        if (wfd.cFileName[0] != _T('.'))
        {
#if _DEBUG
            TCHAR tszPath[MAX_PATH] = {0x0};
            wsprintf(tszPath,_T("%s\\%s\n"), lpstrFolder, wfd.cFileName);
            OutputDebugString(tszPath);
#endif    
            if (wfd.dwFileAttributes &  FILE_ATTRIBUTE_DIRECTORY)
            {
                //普通目录
                DeleteFolder(tszFind);
            }
            else
            {
                if (!DeleteFile(tszFind))
                {
                    OutputDebugStringA("Delete fie failed \n");
                    FindClose(hFind);
                    return FALSE;
                }
                //文件
            }
        }
        else
            continue;
    }
    FindClose(hFind);
    return  RemoveDirectory(lpstrFolder);
}
相关文章
相关标签/搜索