package com.csf.etlinger.common.utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
/**
* 文件操作类
* @author mafenglei 2016-04-06
*/
public class FileUtils {
private static Logger logger = Logger.getLogger(FileUtils.class);
private static final String pathError = "系统该路径不存在!";
/**
* 创建文件
* @param fielPath
* @return
* @throws TblPccsException
*/
public static File createFile(String filePath) throws Exception{
File file = null;
file = new File(filePath);
return file;
}
/**
* 单个文件复制
* @param sourceFile 源文件夹路径
* @param targetFile 目标文件夹路径
* @throws TblPccsException
*/
public static void moveFile(File sourceFile,File targetFile) throws Exception{
FileInputStream fi = null;
FileOutputStream fo = null;
FileChannel in = null;
FileChannel out = null;
try{
fi = new FileInputStream(sourceFile);
fo = new FileOutputStream(targetFile);
in = fi.getChannel();
out = fo.getChannel();
/**连接2个文件通道,从in通道读取,写入到out通道*/
in.transferTo(0, in.size(), out);
}catch (IOException e) {
e.printStackTrace();
logger.error(e.getMessage());
}finally{
try {
fi.close();
fo.close();
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
logger.error(e.getMessage());
}
}
}
/**
* 把一个目录下的所有文件复制到另一个目录下
* @param sourceFile
* @param targetFile
* @throws TblPccsException
*/
public static void moveFolder(String sourcePath,String targetPath) throws Exception{
try{
/**拷贝文件是否存在*/
if(StringUtils.isBlank(sourcePath)){
logger.info(sourcePath+pathError);
return;
}
/**备份路径*/
File targetFile = createFile(targetPath);
if(!targetFile.exists()){
targetFile.mkdirs();//创建文件夹
logger.info("目录[" + targetPath + "]不存在,已创建");
}
/**拷贝文件*/
File sourceFile = createFile(sourcePath);
File[] fileList = sourceFile.listFiles();//目录下所有文件
if(fileList !=null && fileList.length >0){
for(File file : fileList){
if(!file.isFile()){
continue;
}
String name = file.getName();
if(name.endsWith("zip")){
continue;
}
String backFilePath = targetFile.getAbsolutePath()+File.separator+name;
File backFile = createFile(backFilePath);
moveFile(file,backFile);
}
}else{
logger.info(sourcePath+"该路径下没有文件 备份终止");
return;
}
}catch(Exception e){
e.printStackTrace();
logger.error(e.getMessage());
}
}
/**
* 把一个目录下的部分文件移动到另一目录下
* @param original 源文件路径
* @param copy 目标文件路径
* @param number 复制的文件个数
*/
public static void startMove(String original,String copy,int number){
try{
File targetFile = FileUtils.createFile(copy);
if(!targetFile.exists()){
targetFile.mkdirs();
logger.info("目录[" + targetFile + "]不存在,已创建");
}
//待删除的文件
List<String> prepDelFile = new ArrayList<>();
File file = new File(original);
int count = 0;
if(file.exists()){
File [] files = file.listFiles();
if(files.length > 0){
for(int i=0 ; i < files.length ; i ++){
count ++;
String prefectFileName = original + File.separator + files[i].getName();
String copyPath = copy + File.separator + files[i].getName();
/* 文件复制 **/
FileUtils.singleFileReplication(prefectFileName,copyPath);
//放入待删除内存
prepDelFile.add(prefectFileName);
//平分文件
if(count == number){
break;
}
}
}else{
logger.info("目录 [" +original+ "] 下 没有文件");
}
}else{
logger.info("源文件目录[" +original +"] 不存在!");
}
logger.info("目录 【" +original +"】下 "+number+"个文件已成功复制到 【" + copy + " 】目录下" );
/* 文件删除 **/
for(int i=0 ; i < prepDelFile.size() ; i ++){
FileUtils.deleteOneFile(prepDelFile.get(i));//文件删除
}
logger.info("【" +original+ "】目录下"+number+" 原文件 已成功删除!");
}catch(Exception e){
logger.error(e);
e.printStackTrace();
}
}
/**
* 单个文件复制
* @param fatherPath 源文件路径
* @param copyPath 复制文件路径
* @throws IOException
*/
public static void singleFileReplication(String fatherPath,String copyPath) {
try{
//读
FileInputStream fis = new FileInputStream(fatherPath);
BufferedInputStream bufis = new BufferedInputStream(fis);
//写
FileOutputStream fos = new FileOutputStream(copyPath);
BufferedOutputStream bufos = new BufferedOutputStream(fos);
int len = 0;
while ((len = bufis.read()) != -1) {
bufos.write(len);
}
bufis.close();
bufos.close();
}catch(Exception e){
logger.error(e.getMessage());
e.printStackTrace();
}
}
/**
* 文件夹下指定文件复制
* @param sourcePath
* @param targetPath
* @param startStr 文件名以开头的字符串
* @throws TblPccsException
*/
public void moveAppointFile(String sourcePath,String targetPath,String startStr) throws Exception{
try{
/**拷贝文件是否存在*/
if(StringUtils.isBlank(sourcePath)){
logger.info(sourcePath+pathError);
return;
}
/**备份文件夹*/
File targetFile = createFile(targetPath);
if(!targetFile.exists()){
targetFile.mkdirs();
logger.info("目录[" + targetPath + "]不存在,已创建");
}
/**拷贝文件*/
File sourceFile = createFile(sourcePath);
File[] fileList = sourceFile.listFiles();
if(fileList!=null && fileList.length > 0){
for(File file : fileList){
if(!file.isFile()){
continue;
}
/**指定文件*/
String fileName = file.getName();
if(fileName.startsWith(startStr)){
String backFilePath = targetFile.getAbsolutePath()+File.separator+file.getName();
File backFile = createFile(backFilePath);
moveFile(file, backFile);
}
}
}else{
logger.info(sourcePath+"该路径下没有文件");
return;
}
}catch(Exception e){
e.printStackTrace();
logger.error(e.getMessage());
}
}
/**
* 删除指定一个文件
* @param file
* @throws TblPccsException
*/
public static void delFile(File file) throws Exception{
if(file.exists()){
file.delete();
}else{
logger.info(file.getName()+"不存在!");
}
}
/**
* 删除动作
* @param path
*/
public static void deleteAll(String path){
try{
FileUtils.deleteFiles(path);//文件删除
Thread.sleep(1000*2);
FileUtils.delete(path); //文件夹删除
}catch(Exception e){
logger.error(e);
e.printStackTrace();
}
}
/**
* 删除指定目录
* @param path
*/
public static void delete(String path){
File file = new File(path);
if(file.exists()){
file.delete();
logger.info("指定目录 " + path + "已成功删除");
}
}
/**
* 删除指定的一个文件
* @param fileName
*/
public static void deleteOneFile(String fileName){
File file = new File(fileName);
if(file.exists()){
file.delete();
}else{
logger.info("指定文件 【" +file +"】不存在,无法删除");
}
}
/**
* 删除指定目录下的所有文件
* @param delPath
*/
public static void deleteFiles(String delPath){
File file = new File(delPath);
if(file.exists()){
File [] files = file.listFiles();
if(files != null || files.length > 0){
for(int i =0; i<files.length; i ++){
if(files[i].isDirectory()){
deleteFiles(delPath+File.separator+files[i].getName());
}
files[i].delete();
logger.info( delPath + File.separator + files[i] + "文件成功删除");
}
}else{
logger.info(delPath + "该目录下没有文件 ,终止删除操作");
}
}else{
logger.info(delPath + "目录不存在, 终止删除操作");
}
}
// @Test
public static void main(String[] agrs){
// deleteFiles("C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test1");
delete("C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test1");
// String sourcePath = "C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test";
// String targetPath = "C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test1";
// try {
// moveFolder(sourcePath,targetPath);
// System.out.println("运行结束");
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}