2017-11-02
前言
对于机械硬盘而言,简单地将某文件删除掉删的只是这一文件的“引用”而已,记录这份文件的数据序列(机器码)在硬盘中仍是有迹可寻的。除非先前保存这一文件的这段存储空间再次被其它文件序列覆盖,否则借助“文件恢复助手”软件有很大几率可以将刚删掉的文件恢复过来,这对于某些敏感数据或者是某些类似“处女座”的人而言是不可接受的。还有另一个场景,企业员工在离职时一般都要交还公司的电脑。交还电脑前删除私人数据时简单删除删不干净,完全格式化硬盘又不可取,毕竟公司的电脑里肯定会有文件是公有的。于是便有了这一程序的设计动机,当然说到设计动机,更多的是本人觉得“好玩”。本程序工作机制为:1、先简单删除掉私人文件;2、运行本程序,等待程序运行结束。工作原理即是在指定的目录下生成随机数据的文件,直至填满该硬盘所有空间为止。
程序设计与实现
1、本程序结构分为两部分。 a) 代码; b) 配置文件(conf_.ini)。
代码部分负责处理逻辑问题。配置文件部分中记载着控制输出的文件的信息以及部分程序运行控制开关。配置文件是以适配Java中Properties类的“键值对”形式保存的。
关于配置文件的含义请参阅同目录下的 " conf_ini_ReadMe.txt " 文件。
2、程序流程图如下:
3、程序代码简介
本程序为纯Java程序,可导入到Eclipse编译运行,亦可通过命令行编译运行。
本程序共有四个类。
CleanUp类是主方法类。DataWriter类负责根据配置文件中记载的信息,请求随机数据,再将这些数据写出到硬盘。ConfReader 类负责读取配置文件中的信息。RandomGenerator类负责生成随机数据。
CleanUp
主类在实例化以后即将 ConfReader 的实例作为参数传入DataWriter中。
ConfReader
读取并解析配置文件中记载的信息,并将配置信息封装成独立的方法,供外部程序调用。
关于配置文件的路径,程序中设定了3个可能的路径,目的是应对在不同环境(eclipse运行或命令行运行)下运行程序时防止找不到配置文件的问题。
DataWriter
在写数据到文件之前首先会从ConfReader实例中取得所需信息。该操作在方法
1 private void applyProp(ConfReader cr)
中执行。其中,关于文件输出目录,若在配置文件中配置有正确的输出路径(所填写的路径中,所有出现的文件夹都必须存在,否则便视为不正确的路径),则使用配置的路径作为输出目录,否则,使用程序运行的盘符的根目录作为输出目录。
输出目录配置项为 ,读取输出目录配置信息的代码为:
上图所示代码第159行的条件判断若成立,则表明配置文件中配置的输出目录无效,接下来便会读取程序所在盘符的根目录。第163行判断的目的是为了区分windows系统与linux系统。
文件的输出还有“追加”模式可选。当设置为“追加”模式时,写文件前会首先检查指定的目录下是否有名称为本程序指定的前缀与后缀的文件,若有,则在它们的最后一个文件之后追加文件,而不是覆盖已有的文件,此选项默认是开启的。
随后便是根据配置的文件数量与大小来循环写出到硬盘了。
RandomGenerator
通过Math.random生成随机数据,该类仅包含两个普通方法。
1 public byte getRandomCharIndex(long range) 2 3 public byte[] getRandomCharactor(long range, int length)
完整的程序思想请参阅源代码。
测试
在本人的笔记本电脑中开辟一块1G大小的硬盘分区作为测试盘符。在该盘中模拟存入文件数据,然后删除它们,再运行本程序,通过文件恢复软件对比前后被删除的文件的可恢复性。
1、创建新硬盘分区 E 盘并执行完全格式化操作,容量1.07GB ;
2、使用文件恢复软件扫描该盘可恢复文件;
E盘下当前没有可恢复的文件。
3、模拟存入几份数据文件到E盘,然后删除它们,再使用文件恢复软件扫描;
存入几种不同类型的文件。
删除(包括清空回收站)掉它们后,通过文件恢复软件扫描:
恢复所列所有文件。
打开它们,完全没毛病,完整地恢复了过来。
4、运行本文所述程序,填满E盘硬盘空间,随后再删除所有文件。
先前可以被恢复的文件已经全部不见,证明文件在硬盘中已经完全被抹去,删掉的文件已经无法被恢复。
后记
本程序能够有效擦除机械硬盘中的数据文件信息。能够有效保障数据安全与安抚员工心灵。
总得来说,想要完全删除一份文件,可以有如下几种办法:
1、完全格式化硬盘分区(格式时不要勾选“快速格式化”选项);
2、删除掉数据(当然要清空回收站)文件后往硬盘存入其它文件(只要破坏掉原文件数据序列即可,只要硬盘中的数据序列不足以拼凑成一个完整的文件即可,也不是说一定要把所有数据抹去,当然,最保险的方式就是抹去所有数据序列痕迹);
3、删除掉文件后运行一下本文所述程序;
4、其它我不知道的方法。
本文所述程序是本人在仓促之间完成的,并未经过严格的测试,故而不能保证程序运行的稳定性与有效性。按理说本程序在生成完随机数据文件后应该再自动删掉这些文件的,但是本程序没有做这一功能。本程序在效率方面也还有提升的空间,在本文所示的测试例子中填满1GB的空间耗时27秒。总而言之,仓促之作,仅供参考,如有考虑不周之处,还望各位看官海涵。至于代码的优化工作就后面再说了。
源代码: https://github.com/chorm590/CleanUp.git