两个自己函数创建目录和删除目录,考虑了多级目录的情况
使用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); }