package com.lei.tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
/**
* copy文件夹or文件
* @author Mr.Lei
* Time: 2019年1月2日 上午10:28:05
* File: Copys
* Package: com.lei.tool
*/
public class Copys {
//要copy文件的路径,这里不包括标准文件,只能以一个文件夹为标准。(可直接复制到字符串里)
private static final String FileAbsolutePath = "D:\\usr";
//要copy终点路径。(可直接复制到字符串里)
private static final String CopyDir = "D:\\AV\\a" + File.separator;
//获得路径字符串中最后一个文件or文件夹
private static final String PathFile = getString(FileAbsolutePath,"\\\\");
//把最终路径和要复制问文件夹拼接
private static final String CopyPath = CopyDir + PathFile;
//匹配是否不是标准文件
private static final String regex = ".+\\..+";
public static void main(String[] args) throws Exception {
//判断是标准文件或者文件路径是否存在(包括要copy的文件路径和终点路径)
if ( !FileAbsolutePath.matches(regex) && (Exists(FileAbsolutePath) && Exists(CopyDir))) {
//创建文件夹
MkDir(CopyPath);
long start = System.currentTimeMillis();
//对文件或文件夹的判断后进行原样复制
copy(FileAbsolutePath);
long end = System.currentTimeMillis();
System.out.println("Copy the end!!! 用时:"+((float)(end-start)/1000)+"秒");
} else
System.err.println(FileAbsolutePath + "或" + CopyDir
+ "路径异常,请核对一下!!!");
return;
}
/**
* 对文件或文件夹的判断后进行原样复制
* @param fap
* @throws Exception
*/
private static void copy(String fap) throws Exception {
String copyNames=null;
File[] filelist=null;
File file = new File(fap);
//递归判断
if(!fap.equals(FileAbsolutePath)) {
//递归执行copy函数
copyNames= CopyPath+getString(fap,PathFile)+File.separator;
//找出递归的文件夹进行创建
MkDir(copyNames);
}else
//第一次执行copy函数
copyNames=CopyPath+File.separator;
//如果file是文件夹就获得其目录下的所有文件夹或标准文件,返回值File数组
filelist = file.listFiles();
for (int i = 0; i < filelist.length; i++) {
//对filelist数组进行判断,是标准文件就用文件管道进行复制
if(filelist[i].isFile()) {
FileChannel in = new FileInputStream(filelist[i].getAbsolutePath()).getChannel();
FileChannel out = new FileOutputStream(copyNames + filelist[i].getName()).getChannel();
in.transferTo(0, in.size(), out);
out.close();
in.close();
}else
//是文件夹就递归(这里是重点)
copy(filelist[i].getAbsolutePath());
}
}
/**
* 判断路径是否正确
* @param path:路径
* @return false or true
*/
private static boolean Exists(String path){
return new File(path).exists();
}
/**
* 获得路径字符串中最后一个文件or文件夹
* @param fap:文件路径
* @param split:切割条件
* @return 路径中最后的文件or文件夹
*/
private static String getString(String fap ,String split){
return fap.split(split)[fap.split(split).length - 1];
}
/**
* 创建文件夹
* @param path:路径
* @return false or true
*/
private static boolean MkDir(String path){
return new File(path).mkdir();
}
}