try {
File dir = new File(from);
File[] files = dir.listFiles();// 将文件或文件夹放入文件集
if (files == null)// 判断文件集是否为空
return;
File moveDir = new File(to);// 创建目标目录
if (!moveDir.exists()) {// 判断目标目录是否存在
moveDir.mkdirs();// 不存在则创建
}
for (int i = 0; i < files.length; i++) {// 遍历文件集
if (files[i].isDirectory()) {// 如果是文件夹或目录,则递归调用fileMove方法,直到获得目录下的文件
System.out.println("filename:"+files[i].getName()+",isValidDate:"+DateUtil.isValidDate(files[i].getName()));
if(!DateUtil.isValidDate(files[i].getName())){//判断此文件夹是否是一个合法时间格式
fileMove(files[i].getPath(), to + "\\" + files[i].getName(),longtime);// 递归移动文件
}
//判断此文件夹是否是一个合法时间格式 且 计算一个时间差值 和页面上一值做比较
files[i].delete();//删除文件所在原目录
}
}
File moveFile = new File(moveDir.getPath() + "\\"+ files[i].getName()); // 将文件目录放入移动后的目录
if (moveFile.exists()) {// 目标文件夹下存在的话,删除
moveFile.delete();
}
if(DateUtil.isValidDate(files[i].getName()) && DateUtil.getDateLong(DateUtil.strToDate(files[i].getName()),new Date())>Integer.parseInt(longtime)){
files[i].renameTo(moveFile);// 移动文件
System.out.println("文件:"+ files[i]+"移动成功");
}
}
} catch (Exception e) {
throw e;
}
}
/**
* 判定字符串是否是合法时间格式
* @param str
* @return
*/
public static boolean isValidDate(String str) {
boolean convertSuccess=true;
// 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
try {
// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
format.setLenient(false);
format.parse(str);
} catch (ParseException e) {
// e.printStackTrace();
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
convertSuccess=false;
}
return convertSuccess;
}
其中的if判断安个人需求, 这个可完全去掉的, 我的业务是只剪切 时间为格式的文件夹 (格式:yyyyMMdd 例如: 20150114) 并在目标文件夹创建父级目录
个人感觉很多例子都是先复制 后 删除。 这个例子是 直接剪切的一个动作 , 如果你是操作大文件 也许会有优势吧。
同时 还学习 一个定时 任务。 timertask 感觉还不错 也就记录下来了。
package cn.lky.lygf.datamanage.datamigration.service.impl;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import cn.lky.lygf.datamanage.datamigration.bean.DataDirectory;
import cn.lky.lygf.utils.FileUtil;
/**
* Simple demo that uses java.util.Timer to schedule a task to execute
* once 5 seconds have passed.
*/
public class Reminder {
// private DataDirectory dataDirectory = (DataDirectory)ApplicationContextUtil.getBean("dataDirectory");
Timer timer;
DataDirectory dataDirectoryTwo;
public Reminder(DataDirectory dataDirectory) {
dataDirectoryTwo=dataDirectory;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dataDirectory.getRunTime()));
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date time = calendar.getTime();
timer = new Timer();
timer.schedule(new RemindTask(), time, 24*60*60*1000);
}
class RemindTask extends TimerTask {
public void run() {
try {
FileUtil.fileMove(dataDirectoryTwo.getSourceDirectory(), dataDirectoryTwo.getTargeDirectory(),dataDirectoryTwo.getTimeMove());//调用文件剪切方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// timer.cancel(); //Terminate the timer thread
}
}
}
方法:timer.schedule(new RemindTask(), time, 24*60*60*1000);
三个参数 第一个不是很清楚怎样解释 反正就是new一个实体 他需继承TimerTask类 第二个参数为延迟多长时间执行第一次执行run方法 也可以说指定什么时候第一次执行你的业务逻辑 此处我是扫描我上处文件剪切的方法 第三个参数 就是 每隔多长时间执行一次了 如需重复执行 不可加此方法// timer.cancel();