package com.nis.nmsclient.util; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import com.nis.nmsclient.common.Contants; /** * 文件操作类:检索、排序 * */ public class FileUtil { static Logger logger = Logger.getLogger(FileUtil.class); /** * 获取子目录列表 * @param file * @return */ public static File[] getDirectoryArray(File file) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory()) { return true; } else return false; } }); } /** * 获取指定全部或部分名称的文件 * @param file * @param azz * @return */ public static File[] getFilesArray(File file, final String azz) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory()) { return false; } return name.indexOf(azz) != -1; // 过滤出指定全部名称或部分名称的文件 } }); } /** * 获取指定前缀的文件 * @param file * @param suffix * @return */ public static File[] getFilesStartWith(File file, final String prefix) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory()) { return false; } return name.startsWith(prefix); // 过滤出注定前缀名称的文件 } }); } /** * 获取指定时间段指定前缀的文件 * @param file * @param suffix * @return */ public static File[] getFilesStartWithByMillis(File file, final String prefix, final long sTimeMillis, final long eTimeMillis) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory()) { return false; } if (sTimeMillis > 0 && eTimeMillis > 0) { if (new File(dir, name).lastModified() < sTimeMillis || new File(dir, name).lastModified() > eTimeMillis) {// 不在指定时间段 return false; } } return name.startsWith(prefix); // 过滤出注定前缀名称的文件 } }); } /** * 获取指定后缀名的文件 * @param file * @param suffix * @return */ public static File[] getFilesEndWith(File file, final String suffix) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory()) { return false; } return name.endsWith(suffix); // 过滤出注定后缀名称的文件 } }); } /** * 获取指定时间修改的指定后缀名的文件 * @param file * @param suffix * @return */ public static File[] getFilesEndWithBeforeMillis(File file, final String suffix, final long timeMillis) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory() || new File(dir,name).lastModified() > timeMillis) { return false; } return name.endsWith(suffix); // 过滤出注定后缀名称的文件 } }); } /** * 获取指定时间修改的文件 * @return */ public static File[] getFilesBeforeMillis(File file, final long timeMillis) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory() || new File(dir,name).lastModified() > timeMillis) { return false; } return true; } }); } /** * 获取指定毫秒之后修改过的文件 * @param file * @param timeMillis * @return */ public static File[] getFilesAfterMillis(File file, final long timeMillis) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).lastModified() >= timeMillis) { return true; } else return false; } }); } /** * 获取指定时间名称及之前的文件夹 * @param file * @param suffix * @return */ public static File[] getDirsBeforeDateName(File file, final String yyyyMMddName) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory() && name.compareTo(yyyyMMddName)<=0) { return true; } return false; } }); } /** * 获取指定时间名称及之后的文件夹 * @param file * @param suffix * @return */ public static File[] getDirsAfterDateName(File file, final String yyyyMMddName) { if (!file.isDirectory()) { new Exception(file.getAbsolutePath() + " Not A Directory"); } return file.listFiles(new FilenameFilter() { // 使用匿名内部类重写accept方法; public boolean accept(File dir, String name) { if (new File(dir, name).isDirectory() && name.compareTo(yyyyMMddName)>=0) { return true; } return false; } }); } /** * 文件数组按最后修改日期排序,升序 * @param files * @return */ public static File[] sortASCByModify(File[] files) { Arrays.sort(files, new Comparator(){ public int compare(File arg0, File arg1) { if(arg0.lastModified() > arg1.lastModified()){ return 1; }else if (arg0.lastModified() < arg1.lastModified()){ return -1; }else { return 0; } } }); return files; } /** * 文件数组按最后修改日期排序,降序 * @param files * @return */ public static File[] sortDescByModify(File[] files) { Arrays.sort(files, new Comparator(){ public int compare(File arg0, File arg1) { if(arg0.lastModified() > arg1.lastModified()){ return -1; }else if (arg0.lastModified() < arg1.lastModified()){ return 1; }else { return 0; } } }); return files; } /** * 文件数组按名称排序,升序 * @param files * @return */ public static File [] sortASCByFileName(File[] files) { Arrays.sort(files, new Comparator(){ public int compare(File arg0, File arg1) { return arg0.getName().compareTo(arg1.getName()); } }); return files; } /** * 文件数组按名称排序,降序 * @param files * @return */ public static File [] sortDescByFileName(File[] files) { Arrays.sort(files, new Comparator(){ public int compare(File arg0, File arg1) { return arg1.getName().compareTo(arg0.getName()); } }); return files; } /** * 将文件移动到指定文件夹 * * @param f * 源文件 * @param newDir * 新目录 * @param flag * 是否覆盖 true:覆盖 false:不覆盖 */ public static void moveFile(File f, String newDir, boolean flag) { if (!f.exists()) { logger.debug("文件已不存在,无法移动!" + f.getAbsolutePath()); return; } File fileDir = new File(newDir); // 备份目录 if (!fileDir.exists()) { // 检查并创建新目录 fileDir.mkdirs(); } File dtnFile = new File(fileDir.getAbsolutePath() + File.separator + f.getName()); // 制定目标文件路径以及文件名 if (dtnFile.exists() && flag) { // 检查并删除已存在文件 //dtnFile.delete_bak(); //使用删除文件公共方法 FileUtil.delDir(dtnFile); logger.debug("moveFile 删除已存在文件--" + dtnFile.getAbsolutePath()); //FileUtil.checkParentDirExist(dtnFile); } try { FileUtils.copyFile(f, dtnFile); // 移动文件 logger.debug("文件 From 》 " + f.getAbsolutePath() + "\n To 》 " + dtnFile.getAbsolutePath()); if (f.exists()) { logger.debug("删除源文件" + f.getAbsolutePath()); //f.delete_bak(); //使用删除文件公共方法 FileUtil.delDir(f); //FileUtil.checkParentDirExist(f); } else { logger.debug("源文件不存在!不用删了!" + f.getAbsolutePath()); return; } } catch (IOException e) { logger.error(Utils.printExceptionStack(e)); } } /** * 删除文件或文件夹 */ public static void delDir(File file) { try {//文件在可删范围并且不在禁删范围 if (file.exists() && isIncludeDelRange(file) && !isExcludeDelRange(file)) { if (!file.isDirectory()) { file.delete(); logger.debug("FileUtil.delDir(File file)删除文件--" + file.getAbsolutePath()); FileUtil.checkParentDirExist(file); } else if (file.isDirectory()) { delDir2(file); } } } catch (IOException e) { logger.error(Utils.printExceptionStack(e)); } } /** * 递归删除文件夹及其下的所有文件 */ private static void delDir2(File file) throws IOException { if (!file.exists()) { return; } if (!file.isDirectory()) { file.delete(); logger.debug("FileUtil.delDir2(File file)删除文件--" + file.getAbsolutePath()); FileUtil.checkParentDirExist(file); } else if (file.isDirectory()) { if (!isExcludeDelRange(file)) {// 文件不在禁删范围 for (File f : file.listFiles()) { delDir2(f); } file.delete(); logger.debug("FileUtil.delDir2(File file)删除文件夹--" + file.getAbsolutePath()); FileUtil.checkParentDirExist(file); } } } /** * 检查文件是否在可删范围内 * @param file * @return true:是,false:否 */ public static boolean isIncludeDelRange(File file) throws IOException{ boolean flag = false; String path = file.getCanonicalPath(); if(Contants.COMMON_DEL_PATH_INCLUDE!=null){ for(String include : Contants.COMMON_DEL_PATH_INCLUDE){ if(path.startsWith(include)){ flag = true; break; } } }else{//删除范围参数为空,则返回在删除范围 flag = true; } return flag; } /** * 检查文件是否在禁删范围内 * @param file * @return true:是,false:否 */ public static boolean isExcludeDelRange(File file) throws IOException{ boolean flag = false; String path = file.getCanonicalPath(); if(Contants.COMMON_DEL_PATH_EXCLUDE!=null){ for(String exclude : Contants.COMMON_DEL_PATH_EXCLUDE){ if(path.startsWith(exclude)){ flag = true; break; } } }else{//禁删参数为空,则返回不在禁删范围 flag = false; } return flag; } public static void checkParentDirExist(File file){ logger.debug("检查父目录是否存在---" +file.getParentFile().exists() + "---" + file.getParent()); } /** * 格式化处理路径 * @param path * @return */ public static String handlerPath(String path){ File file = new File(path); try { path = file.getCanonicalPath(); } catch (IOException e) { logger.error(Utils.printExceptionStack(e)); } return path; } public static File[] getAll(File dir, int level) { logger.info(getLevel(level) + dir.getName()); level++; File[] files = dir.listFiles(); for (int x = 0; x < files.length; x++) { if (files[x].isDirectory()) getAll(files[x], level); else logger.debug(getLevel(level) + files[x].getName()); } return files; } public static String getLevel(int level) { StringBuilder sb = new StringBuilder(); sb.append("|--"); for (int x = 0; x < level; x++) { sb.insert(0, "| "); } return sb.toString(); } }