QQ登录

只需一步,快速开始

文件夹路径太长无法删除实测有效方法

[ 复制链接 ]
一次不经意用了傻叉公司写的编程软件。
发现生成的工程文件夹无法删除,提示路径过长等等。
真恶心,国产软件真的是一个啊猫了狗都能上任工程师,发布软件。
话不多说,记录下我实践过程。

处理方法1
手工操作,进入文件夹约20层就无法再进入,发再可以将其子文件夹移动到顶层,
删除顶顶层的文件夹,于是手工操作了几次,实在没耐心,手工干不过软件,说不次还有几千层呢。
于是写了个软件来代替手工操作
浏览要删除的文件夹
  1. void CTouchWinCrackDlg::OnBnClickedButton3()
  2. {
  3.     TCHAR szDir[MAX_PATH];
  4.     BROWSEINFO bi;
  5.     ITEMIDLIST* pidl;
  6.     bi.hwndOwner = this->m_hWnd;//拥有者窗口  
  7.     //bi.pidlRoot = GetItemIDListFromFilePath(_T("C:\\tpcbackup\\新建工程0\\v7"));//NULL根目录为桌面
  8.     bi.pidlRoot = NULL;// 根目录为桌面
  9.     bi.pszDisplayName = szDir;//这个是输出缓冲区
  10.     bi.lpszTitle = _T("请选择要删除的文件夹"); //对话框标题
  11.     bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN | BIF_NEWDIALOGSTYLE; //不显示网络路径
  12.     bi.lpfn = NULL;//没有回调
  13.     bi.lParam = 0;//没有额外参数
  14.     bi.iImage = 0;
  15.     pidl = SHBrowseForFolder(&bi);//弹出对话框
  16.     if (pidl == NULL)//点了取消,或者选择了无效的文件夹则返回NULL
  17.         return;

  18.     if (SHGetPathFromIDList(pidl, szDir))
  19.     {
  20.         int Times = 0,Circles = 20;
  21.         CString sSubDir = DeleteMeAndSubFolder(szDir, Circles),sTemp;
  22.         while (!sSubDir.IsEmpty())
  23.         {
  24.             Circles = 20;
  25.             sSubDir = DeleteMeAndSubFolder(sSubDir, Circles);

  26.             Times++;
  27.             sTemp.Format(_T("已执行 %d"), Times);
  28.             m_pListBox->AddString(sTemp);
  29.         }
  30.     }

  31.     CoTaskMemFree((LPVOID)pidl);
  32. }
复制代码
实现递归子文件夹移动到顶层文件夹,再删除顶层文件夹。
  1. CString DeleteMeAndSubFolder(CString dir,int &Circles)
  2. {
  3.     CFileFind finder;
  4.     CString path = dir + _T("\\*");

  5.     BOOL working = finder.FindFile(path);
  6.     while (working)
  7.     {
  8.         working = finder.FindNextFile();
  9.         if (finder.IsDots())
  10.             continue;

  11.         CString foundFile = finder.GetFilePath();
  12.         if (finder.IsDirectory())
  13.         {
  14.             Circles--;
  15.             if (Circles == 0)
  16.             {
  17.                 CString sDstDir = dir.Left(dir.ReverseFind('\\'));
  18.                 bool bRst = MoveFolder(foundFile, sDstDir);
  19.                 bRst = DeleteFolder(dir);
  20.                 //
  21.                 sDstDir = sDstDir + _T("\") + finder.GetFileName();
  22.                 return sDstDir;
  23.             }
  24.             else
  25.             {
  26.                 return DeleteMeAndSubFolder(dir, Circles);
  27.             }
  28.         }
  29.         else
  30.         {
  31.             DeleteFile(foundFile); // 删除文件
  32.         }
  33.     }
  34.     finder.Close();
  35.     return _T("");
  36. }
复制代码
  1. BOOL MoveFolder(LPCTSTR lpszFromPath, LPCTSTR lpszToPath)

  2. {

  3.     int nLengthFrm = strlen(lpszFromPath);

  4.     char* NewPathFrm = new char[nLengthFrm + 2];

  5.     strcpy(NewPathFrm, lpszFromPath);

  6.     NewPathFrm[nLengthFrm] = '\0';

  7.     NewPathFrm[nLengthFrm + 1] = '\0';

  8.     SHFILEOPSTRUCT FileOp;

  9.     ZeroMemory((void*)&FileOp, sizeof(SHFILEOPSTRUCT));

  10.     FileOp.fFlags = FOF_NOCONFIRMATION;

  11.     FileOp.hNameMappings = NULL;

  12.     FileOp.hwnd = NULL;

  13.     FileOp.lpszProgressTitle = NULL;

  14.     FileOp.pFrom = NewPathFrm;

  15.     FileOp.pTo = lpszToPath;

  16.     FileOp.wFunc = FO_MOVE;

  17.     return SHFileOperation(&FileOp) == 0;

  18. }
  19. BOOL DeleteFolder(LPCTSTR lpszPath)

  20. {

  21.     int nLength = strlen(lpszPath);

  22.     char* NewPath = new char[nLength + 2];

  23.     strcpy(NewPath, lpszPath);

  24.     NewPath[nLength] = '\0';

  25.     NewPath[nLength + 1] = '\0';

  26.     SHFILEOPSTRUCT FileOp;

  27.     ZeroMemory((void*)&FileOp, sizeof(SHFILEOPSTRUCT));

  28.     FileOp.fFlags = FOF_NOCONFIRMATION;

  29.     FileOp.hNameMappings = NULL;

  30.     FileOp.hwnd = NULL;

  31.     FileOp.lpszProgressTitle = NULL;

  32.     FileOp.pFrom = NewPath;

  33.     FileOp.pTo = NULL;

  34.     FileOp.wFunc = FO_DELETE;

  35.     return SHFileOperation(&FileOp) == 0;

  36. }
复制代码
也是很慢,一个晚上还没结束。。
此方法不可取。

方法2
用cmd指令,可行可接受
进入要删除文件的上一级文件夹,将要删除文件夹改名为1 并新增空文件夹2 (方便指令操作)
比如我有一文件夹default要删除,进入后将子文件夹命名为1,再新建文件名为2..
ctrl+r 调出小窗口,僌cmd回车,打开cmd命令窗口。。
命令窗口中输入指令进入刚才的文件夹,命名如cd C:\Users\baikhgmv\Desktop\default.
如何进入其他磁盘的文件夹,可自行执行cmd命令。
然后再输入命令robocopy  2  1  /purge
命令窗口开始使命翻滚,用时跟文件夹路径长相关。
约20来分钟后

文件夹路径太长无法删除实测有效方法

文件夹路径太长无法删除实测有效方法

两次打开文件夹就可以成功删除刚才那1,2文件夹
回复

使用道具 举报

快速回复 返回列表 客服中心 搜索