兩個本身函數建立目錄和刪除目錄,考慮了多級目錄的狀況

  使用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);
}
相關文章
相關標籤/搜索