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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值