ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 583|回复: 4

[原创] 能预防删除后容易根据文件名进行选择恢复的对文件夹及文件的删除

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-4-25 01:14 | 显示全部楼层 |阅读模式
昨天,有个朋友因为某些特殊原因,需要对文件夹及文件进行删除,问及我,是否可以恢复的,我只能回答,原则上是可以在短期内恢复,但因为涉及删除数量较多,即使恢复都是选择有用的来恢复,所以可以通过改名的方式,令到对方在恢复时也存在难度。
因为文件及文件夹数量太多了,手工一个个去改名,不现实啊,所以写了个代码去处理了。回家后,把代码再整理一遍,顺便注释上,分享给大家。

删除文件夹及文件(20220424by.micro).rar

24.99 KB, 下载次数: 20

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-4-25 01:14 | 显示全部楼层
  1. Private dicPath As Object, dicChar As Object
  2. Private vSubPath As Variant, sMainPath As String

  3. Sub 删除文件夹及文件()
  4.     Dim sPath As String, nI As Long, nJ As Long, sNewName As String, nPath As Long
  5.    
  6.     Randomize '初始化随机种子
  7.     Set dicChar = CreateObject("Scripting.Dictionary") '初始化记录允许用于文件命名的字符的字典
  8.     sPath = "~!@#$%^&()_+-=`;',.[]{}1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" '允许用于文件命名的字符
  9.     For nI = 1 To Len(sPath)
  10.         dicChar(Mid(sPath, nI, 1)) = 0 '建立允许用于文件命名的字符的字典
  11.     Next
  12.    
  13.     sMainPath = [A3].Value '要删除的主文件夹
  14.     If sMainPath = "" Then Exit Sub '未输入要删除的主文件夹
  15.     If Right(sMainPath, 1) = "" Then sMainPath = Left(sMainPath, Len(sMainPath) - 1) '清理主输入的文件夹名最后一个斜杠
  16.     If Dir(sMainPath, vbDirectory) = "" Then '检查主文件夹是否存在
  17.         MsgBox "输入的主文件夹不存在!“"
  18.         Exit Sub
  19.     End If
  20.    
  21.     nI = Cells(Rows.Count, 1).End(xlUp).Row '获取A列最后一个单元格的行号
  22.     If nI = 5 Then '说明只有一个指定子文件夹
  23.         ReDim vSubPath(1 To 1) '建立单一子文件夹数组
  24.         vSubPath(1) = [A5].Value
  25.     ElseIf nI > 4 Then '说明有多个指定子文件夹
  26.         vSubPath = Application.WorksheetFunction.Transpose([A5].Resize(nI - 4).Value) '获取所有的子文件夹
  27.     End If
  28.    
  29.     Set dicPath = CreateObject("Scripting.Dictionary") '初始化记录用于循环检索子文件夹
  30.     If IsArray(vSubPath) Then '如果子文件夹变量是数组,说明有指定删除的文件夹
  31.         For nI = LBound(vSubPath) To UBound(vSubPath)
  32.             If Dir(sMainPath & "" & vSubPath(nI), vbDirectory) <> "" Then '检查子文件夹存在
  33.                 dicPath(sMainPath & "" & vSubPath(nI)) = vSubPath(nI)  '字典记录需要查子文件夹的文件夹全称为关键字,子文件夹名为项目值
  34.             End If
  35.         Next
  36.     Else '如果子文件夹变量不是数组,说明要对整个主文件夹进行删除
  37.         vSubPath = Split(sMainPath, "") '将原主文件夹用\拆出各级文件夹的名称
  38.         vSubPath = vSubPath(UBound(vSubPath)) '获取主文件夹名
  39.         sMainPath = Left(sMainPath, Len(sMainPath) - 1 - Len(vSubPath)) '获取主文件的上级文件夹全名
  40.         dicPath(sMainPath & "" & vSubPath) = vSubPath   '字典记录需要查子文件夹的文件夹全称为关键字,子文件夹名为项目值
  41.     End If
  42.    
  43.     Do While nPath < dicPath.Count '字典关键字序号小于字典总数
  44.         sPath = dicPath.Keys()(nPath) '获取字典第nPath个需要检索的文件夹名
  45.         SearchDir sPath '检索该文件夹内的文件及子文件夹
  46.         nPath = nPath + 1
  47.     Loop
  48.    
  49.     Do While dicPath.Count > 0 '文件夹字典总数大于0,说明还有文件夹没有删除
  50.         sMainPath = dicPath.Keys()(dicPath.Count - 1) '从最后一个文件夹开始删除,获取删除的文件夹全称
  51.         sPath = dicPath(sMainPath) '获取删除的子文件夹名
  52.         dicPath.Remove sMainPath '清除字典内文件夹名
  53.         sMainPath = Left(sMainPath, Len(sMainPath) - Len(sPath)) '获取子文件夹上级文件夹全称
  54.         sNewName = GetFileName '获取改名用的新名
  55.         Name sMainPath & sPath As sMainPath & sNewName  '将子文件夹进行改名
  56.         RmDir sMainPath & sNewName '删除文件夹
  57.     Loop
  58.     MsgBox "删除完毕!"
  59. End Sub

  60. Sub SearchDir(ByVal sPath As String)
  61. '对指定文件夹进行检索文件及子文件夹
  62.     Dim sFile As Variant, nI As Long, sNewName As String
  63.    
  64.     sPath = sPath & ""
  65.     sFile = Dir(sPath & "*.*", vbDirectory + vbSystem + vbHidden) '检索文件夹内所有文件夹及文件
  66.     Do While sFile <> ""
  67.         If sFile <> "." And sFile <> ".." Then
  68.             If (GetAttr(sPath & sFile) And vbDirectory) = vbDirectory Then
  69.                 If (GetAttr(sPath & sFile) And vbHidden) = vbHidden Then '如果是系统隐藏文件夹
  70.                     SetAttr sPath & sFile, vbNormal '设置文件为正常文件夹
  71.                 End If
  72.                 dicPath(sPath & sFile) = sFile  '记录到文件夹字典
  73.             Else
  74.                 If (GetAttr(sPath & sFile) And (vbSystem + vbHidden)) = vbSystem + vbHidden Then '如果是系统隐藏文件
  75.                     SetAttr sPath & sFile, vbNormal '设置文件为正常文件
  76.                     sNewName = sFile
  77.                 Else
  78.                     sNewName = GetFileName '获取改名用的新名
  79.                     If (GetAttr(sPath & sFile) And vbHidden) = vbHidden Then '如果是隐藏文件
  80.                         SetAttr sPath & sFile, vbNormal '设置文件为正常文件
  81.                     End If
  82.                     Name sPath & sFile As sPath & sNewName '文件改名
  83.                 End If
  84.                 Kill sPath & sNewName '删除文件
  85.             End If
  86.         End If
  87.         sFile = Dir '检索下一个文件夹或文件
  88.     Loop
  89. End Sub

  90. Private Function GetFileName() As String
  91. '建立随机文件名
  92.     Dim nI As Long, nLen As Long, sFile As String
  93.    
  94.     nLen = Int(30 * Rnd) + 20 '获取一个大于大于20,小于50的长度
  95.     For nI = 1 To nLen
  96.         sFile = sFile & dicChar.Keys()(Int((dicChar.Count - 1) * Rnd)) '随机取一个允许字符加到文件名
  97.     Next
  98.     GetFileName = sFile
  99. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-4-25 01:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留一层楼作为以后可能会补充些什么

TA的精华主题

TA的得分主题

发表于 2022-5-19 23:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-10-29 08:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-2 06:53 , Processed in 0.042450 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表