478 lines
12 KiB
Java
478 lines
12 KiB
Java
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<File>(){
|
||
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<File>(){
|
||
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<File>(){
|
||
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<File>(){
|
||
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();
|
||
}
|
||
|
||
}
|