java按时间过滤文件夹_java 递归根据时间删除文件夹

  • Post author:
  • Post category:java


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();    }}



版权声明:本文为weixin_42174098原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。