package test.delete;
/*qq群:18016553 java讨论室,有性趣的朋友可以一起来开心学java*/
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.InputStreamReader;
import java.io.FileFilter;
import java.util.Calendar;
import java.io.InputStream;
import java.util.*;
/**
* 实现fileFilter接口
* 作用:File类的listFiles()将调用
* 为了过滤文件
* @author 传说
* */
class filterFile implements FileFilter {
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
/**
* 作者心得
* 在写这个程序的时候一直困扰了我有一个多月,遇到的
* 第一个问题就是java中无法得到文件夹的创建时间,包括
* 文件的创建的时间都无法得到,这时候,我在网上找了一下
* 发现vc可以得,可我拿里会vc呀,不过还好,总之是懂点,
* 就用我在学校学的那一点点vc的知识,尝试着去得到文件夹的
* 创建时间,写了一段时间了,那指针指过指过去的,而且还有好多
* api,都不知道,最终我放弃了vc得时间,编译成dll用java调
* 的想法………………到此,一直有五六天的时间没有
* 动这个程序,突然有一天,工作不太忙,然后又去网上找了一下
* 获得文件夹创建时间的方法,最终找到了一个解决方法,那就是
* 在dos下……..看那位网友的帖子说的很详细,说得到文件的
* 创建时间的命令在过去的dos下没有提供,dos升级以后对dir命令
* 进行了扩展……….总算是有救了……..
* 现在一切都OK了,就差删文件了…..有的网友可能看过我写的删除
* temp的文件夹的例子….我想当然的认为和那个例子也差不多..
* 大同小异,在我做程序的时候,可不知道为什么,得到了文件夹目录
* 就是删除不了………….此时,又郁闷了我半个月,也求教过
* 别人,也没有解决了……………..当我决忘的时候,有一天
* 我同事也正好没有事干,于是乎了,一起严究了一下这个程序,发现是线程的
* 问题…..至于问题的原因我就不多说了(其实我也不太明白,为什么是那个
* 原因),总之了是出来了,有心的读者可能会发现在删除文件夹的时候让当前线
* 程睡了3毫秒……….
* */
/**
* 该程序的功能
* 该程序主要用来删除文件夹的创建时间为参照时间以后
* 的文件夹…….参照时间函数 isAfterConsult(dirAbsolute, 2007, 5, 7);
* 有待改进
* 该程序还不太完善,有待改进,现在只能删除空文件夹,以后会删除
* 非空文件夹……
* 此程序的目的
* 希望可以对初学java的爱好者,提供帮助
* 对于那些资质高的程序员见笑了……………………
* */
/**
* className:DeleteConsultDateDir
* 作用:删除给定时间以后的文件
* 比如:给定时间是2007-5-7号,如果在查找文件发现
* 文件的创建时间为2007-5-8号,那么将对其进行删除
* @author 传说
* */
public class DeleteConsultDateDir {
//runTime在dos下开启的一个进程
Runtime runTime = null;
//无参构照
DeleteConsultDateDir() {
//初始化进程
runTime = Runtime.getRuntime();
}
//fileSum用于存储处理文件夹的总数
static int fileSum = 0;
//fileSuccess用于存储成功删除的文件夹数
static int fileSuccess = 0;
//fileFaild用于存储删除失败的文件夹数
static int fileFaild = 0;
/**
* 我觉的有必要提醒大家的是
* 给main方法传参的时候,如果参数有空格的
* 的话那么用双引引起来,如果不引那么有几个空
* 格,参数就是空格+1的个数…………..
* */
public static void main(String[] args) throws IOException {
String mainDir = null;
if (args == null || args.length == 0) {
//这是默认要处理的路径
mainDir = “c://Documents and Settings”;
startProcess(mainDir);
} else {
for (String strParam : args) {
startProcess(strParam);
}
}
System.out.println(“处理文件夹总数: ” + fileSum + ” 个”);
System.out.println(“成功删除文件夹: ” + fileSuccess + ” 个”);
System.out.println(“文件夹删除失败: ” + fileFaild + ” 个”);
BufferedInputStream input = new BufferedInputStream(System.in);
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
reader.readLine();
}
private static void startProcess(String mainDir) {
DeleteConsultDateDir obj = new DeleteConsultDateDir();
//用于清除temp的目录
File file = new File(mainDir);
//过滤掉文件,只显示目录
obj.iteratorDir(file.listFiles(new filterFile()));
}
/**
* method:iteratorDir
* 作用:遍历给定的目录以及所有的子目录,掉用相应的方法,把符合条件
* 的文件夹删除
* @param listFiles:File类型的数组
* 作用域:private
* return:void
* */
private void iteratorDir(File[] listFiles) {
if (listFiles == null) {
listFiles = new File[0];
}
for (File file : listFiles) {
fileSum++;
if (!deleteDir(file.getAbsolutePath())) {
//过滤掉文件,只显示目录
iteratorDir(file.listFiles(new filterFile()));
}
}
}
/**
* method:deleteDir
* 作用:把符合条件的目录删除
* @param dirAbsolute
* 作用域:private
* return boolean:删除成功返回true,否则返回false
* */
private boolean deleteDir(String dirAbsolute) {
if (isAfterConsult(dirAbsolute, 2007, 5, 7)) {
File deleteFile = new File(dirAbsolute);
try {
Thread.sleep(3);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
if (deleteFile.delete()) {
System.out.println(dirAbsolute);
printMessage(” ***delete success!!”);
fileSuccess++;
return true;
} else {
fileFaild++;
System.out.println(dirAbsolute);
printMessage(
” ***delete faild because may be system directory!!”);
}
}
return false;
}
/**
* method:printMessage
* 作用:打印消息
* @param state:处理文件的状态
* 作用域:private
* @return void
* */
private void printMessage(String state) {
System.out.println(“state: ” + state);
}
/**
* method:isAfterConsult
* 作用:判断给定文件的创建日期是不是
* 在参照时间的后面
* @param absultDir:绝对路径
* @param year:年
* @param month:月
* @param day:日
* @return boolean 如果是返回true,否则false
* 作用域:private
* */
private boolean isAfterConsult(String absultDir, int year, int month,
int day) {
try {
Process p = runTime.exec(
“cmd /C dir ” + tokenBar(absultDir) + ” /t:c”);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
for (int i = 0; i <= 4; i++) {
br.readLine();
}
String strDate1 = br.readLine();
if (strDate1 == null) {
return false;
}
String[] strDate = strDate1.substring(0, 10).split(“-“);
//得到文件的创建时间
Calendar calFile = Calendar.getInstance();
calFile.clear();
calFile.set(Integer.parseInt(strDate[0]),
Integer.parseInt(strDate[1]) – 1,
Integer.parseInt(strDate[2]));
//设定一个参照时间
Calendar calConsult = Calendar.getInstance();
calConsult.clear();
calConsult.set(year, month – 1, day);
return calFile.after(calConsult);
} catch (java.io.IOException exc) {
exc.printStackTrace();
}
return false;
}
/**
* methodName:tokenBar
* 作用:将字符串按/分隔,在分隔完的串上加上””,然后在
* 组成串返回去,这样做的目的是为了
* 防止有空格的目录
* @param strDir–目录名
* 作用域 private
* @return String
* */
private String tokenBar(String strDir) {
String[] strs = strDir.split(“”); StringBuffer sb = new StringBuffer(); for (int i = 0; i < strs.length; i++) { sb.append(“/””); sb.append(strs[i]); sb.append(“/””); if (i != strs.length – 1) { sb.append(“//”); } } return sb.toString(); }}