两个自己函数创建目录和删除目录,考虑了多级目录的情况

  使用shell api的话删除目录和创建目录都是非常简单的一个函数调用就可以,但是如果是使用为win32里面基本的函数的话,就稍微会复杂点。不过个人感觉shell api里面删除和创建目录的函数也是调用win32里面这些基本的函数。

  创建目录, 可以创建多级目录,代码拷过去稍稍修改可用:

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

 

posted @ 2014-08-07 11:16  菊花也是花  阅读(461)  评论(0编辑  收藏  举报