package lianxi1227;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
/**
* 复制指定文件夹下的所有文件和嵌套文件,并保持原来的结构不变,
* 以百分比显示复制进度,保留两位小数
* @author ytfunny.site
* @ f1 代表源文件
* @ f2 目标文件
*/
public class CopyFileUtil {
public static DecimalFormat df=new DecimalFormat("#.##%");
public static void copypath(File f1,File f2) throws IOException{
List<String> list=copyPath(f1);
int num=list.size();
double count=0.0;
for (String s : list) {
File path=new File(s);
String name=path.getPath();
String newName=name.replace(f1.getParent(),f2.getPath());
File newFile=new File(newName);
if(path.isDirectory()){
boolean b=newFile.mkdirs();
if(b){
count++;
double d=count/num;
System.out.println(newFile.getPath()+"复制完成"+df.format(d));
}else{
System.out.println(newFile.getPath()+"复制失败!");
}
}
if(path.isFile()){
int i=newName.lastIndexOf("\\");
String temppath=newName.substring(0, i);
File ftemp=new File(temppath);
if(!ftemp.exists()){
ftemp.mkdirs();
}
if(!newFile.exists()){
boolean b=newFile.createNewFile();
if(b){
boolean result=Stream(path, newFile);
if(result){
count++;
double d=count/num;
System.out.println(newFile.getPath()+"复制完成"+df.format(d));
}else{
System.out.println(newFile.getPath()+"复制失败!");
}
}
}
}
}
}
/**
* 创建复制内容的流方法
* @param old 源文件
* @param newfile 目标文件
* @return 返回值代表流程序是否复制完成
* @throws IOException 抛出IO传输异常
*/
public static boolean Stream(File old,File newfile) throws IOException{
FileInputStream fis=null;
FileOutputStream fos=null;
try {
fis=new FileInputStream(old);
fos=new FileOutputStream(newfile);
int len=fis.available();
for (int i = 0; i < len; i++) {
fos.write(fis.read());
}
} catch (IOException e) {
return false;
}finally{
try {
if(fos!=null){
fos.close();
}
if(fis!=null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
/**
* 创建一个存储指定文件夹下所有目录和嵌套文件的绝对路径,存在list集合中
* @param file 源文件
* @return 返回值代表源文件下所有目录以及文件的绝对路径是否复制完成
*/
public static List<String> copyPath(File file){
List<String> list=new ArrayList<String>();
if(file.isDirectory()){
File[] files=file.listFiles();
if(file.length()>0){
for (File f : files) {
if(f.isDirectory()){
List<String> mlist=copyPath(f);
list.addAll(mlist);
}else{
list.add(f.getPath());
}
}
}else{
list.add(file.getPath());
}
}else{
list.add(file.getPath());
}
return list;
}
}