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);//将每一个子目录文件夹添加到list集合中
}else{//如果遍历出来是文件
list.add(f.getPath());//将文件路径存入list集合
}
}
}else{//如果目录为空
list.add(file.getPath());//将空目录路径添加到list集合
}
}else{//如果传进来的file对象是文件
list.add(file.getPath());//将文件路径添加到list集合
}
return list;
}
}
复制已知文件夹工具(显示进度)
最新推荐文章于 2021-08-13 11:11:34 发布