Board logo

标题: [文件操作] [分享]批处理实现文件粉碎功能 [打印本页]

作者: TX_kakashi    时间: 2010-8-3 18:37     标题: [分享]批处理实现文件粉碎功能

来bathome不久,感觉这里的学习气氛非常高涨严谨,以前自学了N久的学到的批处理知识还不如这里一天学到的多。这个代码是多久前就有构思,不过苦于当时技术不足,没能实现,最近现学现用,总算完成了。希望听听高手们的意见,努力改善代码。)
(用了很多笨办法,望高手斧正)
  1. ::主思想是将文件进行清0运算,然后命名为随机名字,再进行删除,这样如果用恢复软件恢复的化
  2. ::也没办法复原原来的文件。对文件夹则是直接随机命名然后删除。
  3. ::理论上应该是fsutil对文件进行清0效果最好,不过考虑到fsutil只能在ntfs上处理,而且需要管
  4. ::理员权限才能运行,最后还是用了最通用的copy命令。
  5. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6. @echo off
  7. title [DELTER v1.1 by Heroest@6park]
  8. ::02/08/2010
  9. :bof
  10. ::开启延迟变量
  11. setlocal enabledelayedexpansion
  12. cls
  13. ::用set/p来获得路径
  14. set /p input=[Drag single file or folder into here]:
  15. ::判断是文件还是文件夹
  16. if exist %input%\ goto folder
  17. if exist %input% goto file
  18. echo ERROR.&pause
  19. goto bof
  20. :folder
  21. ::将%input%路径push一下,这样当前路径就变为%input%了
  22. pushd %input%
  23. ::历遍文件夹内所有文件,并将详细路径参数传递给:myDel处理
  24. for /f "delims=" %%a in ('dir /b /s /a-d') do echo Deleting [%%a] && call :myDel "%%a"
  25. ::准备删除文件夹了,先生成临时列表
  26. echo.&echo [Deleting Folders...]
  27. echo.>temp.txt
  28. set numOfFol=0
  29. ::这里碰到了点问题,因为用dir生成的列表格式是先根目录,然后再是子目录,这样的话对随后的
  30. ::重命名工作带来了麻烦,所以用了延时变量重新生成了一个跟原来完全相反的目录列表(先是::子目录,然后是根目录)
  31. for /f "delims=" %%b in ('dir /b /s') do (set /a numOfFol+=1 && set fol_!numOfFol!=%%b)
  32. for /l %%c in (%numOfFol%,-1,1) do (echo !fol_%%c!>>temp.txt)>nul 2>nul
  33. ::目录列表重新整理好了,现在可以进行命名了。我这里使用了子程序的办法,将路径信息传递给
  34. ::  :myRen来处理
  35. for /f "skip=1 delims=" %%d in ('type temp.txt ^& echo.^>temp.txt') do call :myRen "%%d" >nul 2>nul
  36. ::%input%下所有内容都处理好了,现在轮到%input%本身了,先回复原来的路径先
  37. popd
  38. ::将%input%的路径信息传给:rootRen那里处理
  39. call :rootRen %input%
  40. rd /s /q "%rootPath%%rootName%"
  41. goto bof
  42. ::如果%input%是个单独文件就原封不动传递给:del处理
  43. :file
  44. echo Deleting [%input%]
  45. call :myDel %input%
  46. goto bof
  47. ::这里定义了一个名叫:myDel的label,负责把参数传递的目标文件进行清0运算并随机重命名
  48. :myDel
  49. for /f "delims=" %%I in ("%~1") do set delPath=%%~dpI
  50. copy nul "%~1" >nul 2>nul
  51. set newName=%random%_%random%.%random%
  52. ren "%~1" %newName%
  53. del "%delPath%%newName%"
  54. exit/b
  55. ::定义了个名为:myRen的label,负责为文件夹改名
  56. :myRen
  57. ren "%~1" %random%_%random%.%random%
  58. exit/b
  59. ::名为:rootRen的label,负责为主目录改名,并生成新的路径信息。
  60. :rootRen
  61. set rootName=%random%.%random%_%random%
  62. for /f "delims=" %%I in ("%~1") do set rootPath=%%~dpI
  63. ren "%~1" %rootName%
  64. exit/b
复制代码

[ 本帖最后由 TX_kakashi 于 2010-8-4 18:35 编辑 ]
作者: sgaizxt001    时间: 2010-8-4 05:58

能否讲一下思路,代码估计没多少人看完。
作者: wankoilz    时间: 2010-8-4 08:19

估计核心是这句:copy nul "%~1"
这种删除文件的方式倒是没见过...
作者: hfg1977    时间: 2010-8-4 12:02

re: LZ代码存在的问题:
1.不要用与CMD命令相同的字符作为标签,如你的 el
2. set /p input=。。。
  if exist 。。。
这里最好做错误检验处理。(既不是文件夹也不是文件情况)
3.也是最根本最严重的问题:
该程序不能起到粉碎文件的作用。
copy nul filename  命令只是创建新的空文件(0字节文件)
无论你后面再怎么重命名,删除,都起不到粉碎原文件的作用。

想粉碎粉碎文件首先要明白什么叫粉碎文件?
建议google下硬盘结构、文件存储类知识。
作者: TX_kakashi    时间: 2010-8-4 18:25

多谢6楼兄弟指教。
1.这个问题下次我会注意的 =P
2.额,容错处理是我的一个失误,已改进。(这里有个问题我想请教:能拖放到批处理上面的出了文件夹或者文件还有什么?)
3.我之前也找过文件粉碎的资料:用垃圾数据覆盖文件所占的硬盘空间,还得把目录区的信息也删除掉。dos下如果只考虑内容部分粉碎的话最好是fsutil file setzero指令,不过局限也很大,首先是要求ntfs,再者需要管理员权限。所以我的本意只是有这么一个工具可以删除掉文件,并尽可能的防止类似easyrecovery这类恢复软件来恢复。如果考虑到物理层面的反删除,我做的还差的很远,我会尽可能去完善。
作者: hfg1977    时间: 2010-8-4 19:04

re:2 文件夹或者文件还有什么? 没了吧???!!
3.fsutil file setzero 这个命令也没用的.
    新建的文件在磁盘上的位置并不能保证与源文件的一致,所以一切建立新文件的方法都是不保险的.
    想粉碎只有一个方法: 查文件分配表-----查每一个文件链表, 全部用"0"或"随机数据"覆盖.

easyrecovery这类恢复软件所能恢复的都是简单的,不然也不会有人花费几千~几百万的去恢复数据了.

[ 本帖最后由 hfg1977 于 2010-8-4 19:10 编辑 ]




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2