一次不经意用了傻叉公司写的编程软件。
发现生成的工程文件夹无法删除,提示路径过长等等。
真恶心,国产软件真的是一个啊猫了狗都能上任工程师,发布软件。
话不多说,记录下我实践过程。
处理方法1
手工操作,进入文件夹约20层就无法再进入,发再可以将其子文件夹移动到顶层,
删除顶顶层的文件夹,于是手工操作了几次,实在没耐心,手工干不过软件,说不次还有几千层呢。
于是写了个软件来代替手工操作
浏览要删除的文件夹
- void CTouchWinCrackDlg::OnBnClickedButton3()
- {
- TCHAR szDir[MAX_PATH];
- BROWSEINFO bi;
- ITEMIDLIST* pidl;
- bi.hwndOwner = this->m_hWnd;//拥有者窗口
- //bi.pidlRoot = GetItemIDListFromFilePath(_T("C:\\tpcbackup\\新建工程0\\v7"));//NULL根目录为桌面
- bi.pidlRoot = NULL;// 根目录为桌面
- bi.pszDisplayName = szDir;//这个是输出缓冲区
- bi.lpszTitle = _T("请选择要删除的文件夹"); //对话框标题
- bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN | BIF_NEWDIALOGSTYLE; //不显示网络路径
- bi.lpfn = NULL;//没有回调
- bi.lParam = 0;//没有额外参数
- bi.iImage = 0;
- pidl = SHBrowseForFolder(&bi);//弹出对话框
- if (pidl == NULL)//点了取消,或者选择了无效的文件夹则返回NULL
- return;
- if (SHGetPathFromIDList(pidl, szDir))
- {
- int Times = 0,Circles = 20;
- CString sSubDir = DeleteMeAndSubFolder(szDir, Circles),sTemp;
- while (!sSubDir.IsEmpty())
- {
- Circles = 20;
- sSubDir = DeleteMeAndSubFolder(sSubDir, Circles);
- Times++;
- sTemp.Format(_T("已执行 %d"), Times);
- m_pListBox->AddString(sTemp);
- }
- }
- CoTaskMemFree((LPVOID)pidl);
- }
复制代码 实现递归子文件夹移动到顶层文件夹,再删除顶层文件夹。
- CString DeleteMeAndSubFolder(CString dir,int &Circles)
- {
- CFileFind finder;
- CString path = dir + _T("\\*");
- BOOL working = finder.FindFile(path);
- while (working)
- {
- working = finder.FindNextFile();
- if (finder.IsDots())
- continue;
- CString foundFile = finder.GetFilePath();
- if (finder.IsDirectory())
- {
- Circles--;
- if (Circles == 0)
- {
- CString sDstDir = dir.Left(dir.ReverseFind('\\'));
- bool bRst = MoveFolder(foundFile, sDstDir);
- bRst = DeleteFolder(dir);
- //
- sDstDir = sDstDir + _T("\") + finder.GetFileName();
- return sDstDir;
- }
- else
- {
- return DeleteMeAndSubFolder(dir, Circles);
- }
- }
- else
- {
- DeleteFile(foundFile); // 删除文件
- }
- }
- finder.Close();
- return _T("");
- }
复制代码- BOOL MoveFolder(LPCTSTR lpszFromPath, LPCTSTR lpszToPath)
- {
- int nLengthFrm = strlen(lpszFromPath);
- char* NewPathFrm = new char[nLengthFrm + 2];
- strcpy(NewPathFrm, lpszFromPath);
- NewPathFrm[nLengthFrm] = '\0';
- NewPathFrm[nLengthFrm + 1] = '\0';
- SHFILEOPSTRUCT FileOp;
- ZeroMemory((void*)&FileOp, sizeof(SHFILEOPSTRUCT));
- FileOp.fFlags = FOF_NOCONFIRMATION;
- FileOp.hNameMappings = NULL;
- FileOp.hwnd = NULL;
- FileOp.lpszProgressTitle = NULL;
- FileOp.pFrom = NewPathFrm;
- FileOp.pTo = lpszToPath;
- FileOp.wFunc = FO_MOVE;
- return SHFileOperation(&FileOp) == 0;
- }
- BOOL DeleteFolder(LPCTSTR lpszPath)
- {
- int nLength = strlen(lpszPath);
- char* NewPath = new char[nLength + 2];
- strcpy(NewPath, lpszPath);
- NewPath[nLength] = '\0';
- NewPath[nLength + 1] = '\0';
- SHFILEOPSTRUCT FileOp;
- ZeroMemory((void*)&FileOp, sizeof(SHFILEOPSTRUCT));
- FileOp.fFlags = FOF_NOCONFIRMATION;
- FileOp.hNameMappings = NULL;
- FileOp.hwnd = NULL;
- FileOp.lpszProgressTitle = NULL;
- FileOp.pFrom = NewPath;
- FileOp.pTo = NULL;
- FileOp.wFunc = FO_DELETE;
- return SHFileOperation(&FileOp) == 0;
- }
复制代码 也是很慢,一个晚上还没结束。。
此方法不可取。
方法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文件夹
|