zoukankan      html  css  js  c++  java
  • 两个自己函数创建目录和删除目录,考虑了多级目录的情况

      使用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] = {''};
    
        while(ptszTok != NULL)
        {
            int pos = 0; //记录当前文件上一次目录结束位置(字符串中)
            if (tszTempPath[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] = '';
                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
    "), lpstrFolder, wfd.cFileName);
                OutputDebugString(tszPath);
    #endif    
                if (wfd.dwFileAttributes &  FILE_ATTRIBUTE_DIRECTORY)
                {
                    //普通目录
                    DeleteFolder(tszFind);
                }
                else
                {
                    if (!DeleteFile(tszFind))
                    {
                        OutputDebugStringA("Delete fie failed 
    ");
                        FindClose(hFind);
                        return FALSE;
                    }
                    //文件
                }
            }
            else
                continue;
        }
        FindClose(hFind);
        return  RemoveDirectory(lpstrFolder);
    }
  • 相关阅读:
    【Android】4.1 UI设计器
    【Android】4.0 Android项目的基本结构
    【Android】3.25 示例25--调启百度地图
    【Android】3.24 示例24--OpenGL绘制功能
    【Android】3.23 示例23--瓦片图功能
    【Android】3.22 示例22--LBS云检索功能
    【Android】3.21 示例21—兴趣点收藏功能
    【Android】3.20 示例20—全景图完整示例
    【Android】3.19 示例19--全景图HelloWorld
    Java并发编程之happens-before
  • 原文地址:https://www.cnblogs.com/just-bg/p/3896726.html
Copyright © 2011-2022 走看看