复制已知文件夹工具(显示进度)
2016-12-28 16:41
295 查看
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) aafc ; 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; } }
相关文章推荐
- 复制已知文件夹下所有内容,显示进度
- 让cp显示进度的工具,拷贝文件夹也是可以的
- 复制文件夹及显示进度条
- 使用API函数复制文件,可显示进度。
- [懵懂边缘]使用C#在进度条中显示复制文件的进度
- 将cwindows.复制到当前目录并显示进度
- C#在进度条中显示复制文件的进度
- C#在进度条中显示复制文件的进度
- 使用C#在进度条中显示复制文件的进度
- 使用C#在进度条中显示复制文件的进度
- 遍历文件和文件夹,并用滚动条显示进度和写入错误日志
- 使用C#在进度条中显示复制文件的进度
- 使用C#在进度条中显示复制文件的进度
- 使用C#在进度条中显示复制文件的进度
- 使用C#在进度条中显示复制文件的进度
- [C#]实现文件复制[更新]实时显示进度条
- 使用C#在进度条中显示复制文件的进度
- 工具档里的:文件夹选项/查看/显示所有文件夹和文件,按扭无效
- [vc]复制文件时显示复制进度
- 使用C#在进度条中显示复制文件的进度