垃圾文件清理工具

在工作中,我们需要清理一些在程序过程中产生的垃圾或者无需保留文件,但是因为不知情或者经常忘记的缘故,这些文件便积累起来,分布在各个目录中,难于查找和删除。特别是对于CAD作图的人来说,有时候形成一些.dwl, .plt, .err, .log, .ac$, .tmp等之类的文件,长期以来,既不美观,又浪费空间,的确有必要清理一下。而且下面这个程序可以帮你达到目的。网上有这样类似的程序,但可能比较庞杂,不会像这样针对特别目的。

程序截图:

vb-cadcleaner

CADCleaner

很久之前我就写了这个程序,开始时是用VLISP程序写的,后来我在学习VB的过程中,又把程序再次写了一遍,最后我用VC++重写。所以这个程序有三种版本的。这里我先发布VB语言的。

关于这个程序的源码我就不发布了,附件仅仅包含程序。这里贴出一段关键代码,就是用API 查找特定文件的代码:

  1. '**********************************************************************************************************************
  2. '查找函数
  3. Public Function FindFilesAPI(path As String, SearchStr As Variant, FileCount As Long, DirCount As Long) As Double
  4.     Dim FileName    As String           '文件名
  5.     Dim Extension   As String           '文件后缀
  6.     Dim DirName     As String           '子目录名
  7.     Dim dirNames()  As String           '目录数组
  8.     Dim nDir        As Long             '当前路径的目录数
  9.     Dim i           As Long             '循环计数器变量
  10.     Dim hSearch     As Long             '搜索句柄变量
  11.     Dim WFD         As WIN32_FIND_DATA
  12.     Dim Cont        As Long
  13.  
  14.     If Right(path, 1) <> chr(92) Then path = path & chr(92)
  15.     '搜索子目录
  16.     nDir = 0
  17.     ReDim dirNames(nDir)
  18.     Cont = True
  19.     hSearch = FindFirstFile(path & "*", WFD)
  20.     If hSearch <> INVALID_HANDLE_VALUE Then
  21.         Do While Cont
  22.             FileName = StripNulls(WFD.cFileName)
  23.             If (FileName <> ".") And (FileName <> "..") Then
  24.                 '遍历目录并累计文件总数
  25.                 If GetFileAttributes(path & FileName) And FILE_ATTRIBUTE_DIRECTORY Then
  26.                     dirNames(nDir) = FileName
  27.                     DirCount = DirCount + 1
  28.                     nDir = nDir + 1
  29.                     ReDim Preserve dirNames(nDir)
  30.                 Else
  31.                     If isCheckAll Or UserForm1.ZERO.Value And WFD.nFileSizeLow = 0 Then
  32.                         If isCheckAll Then
  33.                             FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
  34.                         End If
  35.                         FileCount = FileCount + 1
  36.                         UserForm1.List1.AddItem path & FileName
  37.                     Else
  38.                         Extension = Mid(FileName, InStrRev(FileName, ".") + 1)
  39.                         If CheckType(Extension, SearchStr) Then
  40.                             FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
  41.                             FileCount = FileCount + 1
  42.                             UserForm1.List1.AddItem path & FileName
  43.                             SendMessage LHwnd, WM_VSCROLL, SB_BOTTOM, 0&
  44.                         End If
  45.                     End If
  46.                 End If
  47.             End If
  48.             Cont = FindNextFile(hSearch, WFD)         '获取下一个文件或者文件夹
  49.         Loop
  50.         Cont = FindClose(hSearch)
  51.     End If
  52.     '如果子目录存在则遍历之
  53.     If nDir > 0 And UserForm1.INC.Value Then
  54.         For i = 0 To nDir - 1
  55.             FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & chr(92), SearchStr, FileCount, DirCount)
  56.         Next i
  57.     End If
  58. End Function

VC版本的:

  1. int CCADCleanerDlg::Search(CString PathName)
  2. {
  3. 	CString FileName;
  4. 	HANDLE hScan=NULL;
  5. 	WIN32_FIND_DATAW FindFileData;
  6. 	if (PathName.Right(1) != (chr(92)))
  7. 	{
  8. 		hScan = FindFirstFile(PathName +_T("*"),&FindFileData);
  9. 	}
  10. 	else
  11. 	{
  12. 		hScan = FindFirstFile(PathName +_T("*"),&FindFileData);
  13. 	}
  14.  
  15. 	if ( hScan != INVALID_HANDLE_VALUE)
  16. 	{
  17. 		BOOL cont = TRUE;
  18. 		while (cont)
  19. 		{
  20. 			FileName =  FindFileData.cFileName;
  21. 			if (FileName!=_T(".") && FileName!=_T(".."))
  22. 			{
  23. 				if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  24. 				{
  25. 					DirCount++;
  26. 					Search(PathName+FileName+chr(92));
  27. 				}
  28. 				else
  29. 				{
  30. 					if (Check(FileName,FindFileData.nFileSizeLow,FindFileData.nFileSizeHigh))
  31. 					{
  32. 						//m_strInfo = (PathName+FileName);
  33. 						m_list.AddString(PathName+FileName);
  34. 						//m_Info.SetWindowText(m_strInfo);
  35. 						//m_list.SendMessage(LB_ADDSTRING,NULL,(LPARAM)(FileName.GetBuffer()));
  36. 						//SendMessage(m_listWnd,LB_ADDSTRING,NULL,(LPARAM)(FileName.GetBuffer()));
  37. 						//m_list.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);
  38. 						FileCount++;
  39. 						if (FindFileData.nFileSizeHigh)
  40. 						{
  41. 							TotalSize += (FindFileData.nFileSizeLow + FindFileData.nFileSizeHigh * FOUR_GB);
  42. 						}
  43. 						else
  44. 						{
  45. 							TotalSize += FindFileData.nFileSizeLow;
  46. 						}
  47. 					}
  48. 				}
  49. 			}	
  50. 			cont = FindNextFile(hScan,&FindFileData);
  51. 		}
  52. 		FindClose(hScan);
  53. 		return TRUE;
  54. 	}
  55. 	else
  56. 	{
  57. 		return ERROR;
  58. 	}
  59. }

截图:
cadcleaner(VC)
CADCleaner(VC)
当然是用C语言编写的快些了。


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注