0
点赞
收藏
分享

微信扫一扫

目录遍历和删除

影子喵喵喵 2022-03-31 阅读 66

//这是第一种删除指定目录路径文件的方法并显示在对话框成员变量中

BOOL DeleteFolder(LPCTSTR lpszFolderPath, CMFCApplication1Dlg *p)

{

   //先进行简单的字符串判断

   if (!lpszFolderPath || _tcslen(lpszFolderPath) <= 0)

   {

       return FALSE;

   }


   //把参数拷贝给局部变量

   TCHAR szFindPath[MAX_PATH]{};

   _tcscpy_s(szFindPath, MAX_PATH , lpszFolderPath);


   //检测路径结尾是否包含反斜杠

   int iIndex = _tcslen(lpszFolderPath) - 1;

   if (lpszFolderPath[iIndex] == _T('\\'))

   {

       szFindPath[iIndex] = _T('\0');

   }

   _stprintf_s(szFindPath,MAX_PATH , _T("%s\\*.*"), szFindPath);


   //开始遍历

   WIN32_FIND_DATAW FindData;

   HANDLE hWnd = FindFirstFile(szFindPath,&FindData);

   if (INVALID_HANDLE_VALUE == hWnd)

   {

       return FALSE;

   }

   static int i = 0;

   while (FindNextFile(hWnd, &FindData))

   {

       if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && //似乎没必要判断的文件夹属性

           (FindData.cFileName == CString(_T(".")) || FindData.cFileName == CString(_T("..")))

           )

           continue;


       //检查文件属性

       if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

       {

           //是文件夹,构筑子字符串

           if (lpszFolderPath[iIndex] == _T('\\'))

           {

               _tcscpy_s(szFindPath, MAX_PATH, lpszFolderPath);

               szFindPath[iIndex] = '\0';

               _stprintf_s(szFindPath, MAX_PATH, _T("%s\\%s"), szFindPath, FindData.cFileName);

           }

           else

           {

               _stprintf_s(szFindPath, MAX_PATH, _T("%s\\%s"), lpszFolderPath, FindData.cFileName);

           }

           //递归调用

           DeleteFolder(szFindPath,p);

           //退出递归

           RemoveDirectory(szFindPath);//删除空目录

       }

       else

       {

           //是文件

           DeleteFile(CString(lpszFolderPath) + _T("\\") + FindData.cFileName);

       }


       TCHAR szTemp[25];

       _stprintf_s(szTemp, 25, _T("%d"),i);

       p->m_list2.InsertItem(i, szTemp);

       p->m_list2.SetItemText(i++, 1, CString(lpszFolderPath) + _T("\\")+ FindData.cFileName);

   }

   FindClose(hWnd);//使用CloseHandle会报错

   return TRUE;

}



//获取两个临时文件目录

BOOL GetPath(std::vector<CString>& ap)

{

   TCHAR szUseTemp[MAX_PATH]{};

   GetTempPath(MAX_PATH, szUseTemp);//获取用户临时目录

   TCHAR szSysTemp[MAX_PATH]{};

   GetWindowsDirectoryW(szSysTemp, MAX_PATH);//获取系统:\windows路径

   _tcscat_s(szSysTemp, MAX_PATH, _T("\\Temp\\"));

   ap.push_back(szUseTemp);

   ap.push_back(szSysTemp);

   return TRUE;

}  


//删除参数目录路径下的文件和文件夹

BOOL DeleteFileEx(TCHAR *p)

{

   if (!p || _tcslen(p) <= 0)

   {

       return FALSE;

   }

   TCHAR szPath[MAX_PATH]{};//保存传入路径

   int nIndex = _tcslen(p) - 1;

   _tcscpy_s(szPath, MAX_PATH, p);

   if (p[nIndex] == _T('\\'))

   {

       szPath[nIndex] = '\0';

   }


   //格式化字符串

   _stprintf_s(szPath, MAX_PATH, _T("%s\\*.*"), szPath);



   WIN32_FIND_DATAW i;

   HANDLE hWnd = FindFirstFile(szPath,&i);

   if (INVALID_HANDLE_VALUE == hWnd) return FALSE;

   ;

   while (FindNextFile(hWnd, &i))

   {

       TCHAR szSubPath[MAX_PATH]{};//将上次传入的路径参数保存

       _tcscpy_s(szSubPath, MAX_PATH, p);//这语句不得不放在这里否则下面调用RemoveDirectory会生成无效的路径导致删除文件失败

       if (p[nIndex] == _T('\\'))//因为目录删除后不会更新szSubPath导致路径错误

       {

           szSubPath[nIndex] = '\0';

       }



       if (CString(i.cFileName) == _T(".") || CString(i.cFileName) == _T("..")) continue;

       ;        

       if (i.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

       {

           //是文件夹

           _tcscat_s(szSubPath, MAX_PATH, CString('\\') + i.cFileName);

           DeleteFileEx(szSubPath);//系统不保证目录是最先调用

           RemoveDirectory(szSubPath);

       }

       else

       {

           //是要删除的文件

           DeleteFile(szSubPath + CString(_T("\\")) + i.cFileName);

       }

   }


   FindClose(hWnd);

   return TRUE;

}

举报

相关推荐

0 条评论