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