输入需要复制的目标文件夹
输入需要复制到的目的文件夹
public class CopyDir {
static Scanner in = new Scanner(System.in);
static File dir=null;
public static void main(String[] args) {
System.out.println("请输入需要复制的目标文件夹的路径:");
String need = in.nextLine();
dir = new File(need);
// dir = new File("F:\\0123");
String fordir = dir.getPath();
System.out.println("请输入复制到目的文件夹的路径:");
String destDir = in.nextLine();
File dest = new File(destDir);//把目的文件夹封装成文件对象 主要是判断该目的文件夹下是否 含有目标文件夹
//目标文件夹 复制到该文件夹下
// File dest = new File("F:");//\\MyServer
//将目标文件夹的所有文件以及文件夹 复制到该文件夹下 该文件夹的名字肯能和目标文件夹同名
destDir = dest.getPath()+"\\"+dir.getName();
if(!dest.isDirectory()){
System.out.println("请输入一个文件夹的路径");
return;
}
//判断该目的文件夹下是否 含有目标文件夹
else{
// 主要是想练习下 文件过滤 才写的以下代码 判断该目的文件夹下是否 含有目标文件夹
// //如果dest为 文件而不是文件夹的话 listFiles方法会抛出NullPointerException异常
// File[] files = dest.listFiles(new FilenameFilter(){
// public boolean accept(File dir, String name) {
// System.out.println(name);//dir就是dest 那么name就是dest下所有文件的名字包括文件夹和文件
// return name.equals(CopyDir.this.dir.getName());
// }});
// System.out.println(files.length);
// //长度等于1的时候说明复制到的目标文件夹下 有同名文件夹 也就是说 被复制的文件夹在复制到的文件夹内 此时 创建文件夹副本
// if(files.length==1){
// destDir = dest.getPath()+"\\"+dir.getName()+"-副本";
//判断该目的文件夹下是否 含有目标文件夹 通过文件是否存在来判断
File toDir = new File(destDir);
if (toDir.exists()) {
destDir = dest.getPath()+"\\"+dir.getName()+"-副本";
toDir = new File(destDir);
}
int count = 0;
while (toDir.exists()) {
count++;
if(!destDir.contains("-副本("+(count-1)+")"))
destDir = dest.getPath()+"\\"+dir.getName()+"-副本(1)";
else
destDir = destDir.replace("-副本("+(count-1)+")", "-副本("+count+")");
toDir = new File(destDir);
}
toDir.mkdir();
}
if (dir.isDirectory()){
System.out.println("开始复制。。。");
copyDir(dir,fordir,destDir);
}
else{
System.out.println("您输入的不是文件夹!");
return;
}
System.out.println("目标文件夹:"+dir.getName()+"->复制到目的文件夹:"+destDir+",,复制成功");
}
public static void copyDir(File dir,String fordir,String destDir) {
File[] files = dir.listFiles();
for (File file : files) {
//注意 要先创建该文件夹对应的目的的新同名文件夹 然后递归
if(file.isDirectory()){
//将文件夹内的文件复制到另一个文件夹中 在复制文件前 需要先创建存放文件的文件夹
File toDir = new File(file.getPath().replace(fordir, destDir));
toDir.mkdir();
//先创建 文件夹 再递归
copyDir(file,fordir,destDir);
}
else{
//复制的新文件
File tofile = new File(file.getPath().replace(fordir, destDir));
try {
tofile.createNewFile();
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(tofile);
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf))!=-1) {
fos.write(buf,0,len);
}
fis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*
复制文件夹
从原文件夹中读取文件 赋值到文件夹副本中 实际上就是复制文件到 创建的文件夹副本中
1,从原文件夹中读取数据fs[i].isFile() fs[i]是 文件的时候 直接复制
2, fs[i]是文件夹的时候 首先 创建子文件夹副本 然后将原子文件夹内的文件复制到文件夹副本中
子文件夹副本在上一级文件夹副本中 定义一个字符串存储 文件路径
*/
class copyDir
{
String s = "null";//最外层 目录路径
String path = "null";//定义一个字符串存储 文件路径
public void readDir(File f,int lev) throws Exception//形参f代表的是 原文件夹
{
lev++;
if(lev == 1)
{
s = f.getName();
System.out.println(s);
path = f.getPath().replaceAll(s,s+"副本");
System.out.println(path);
File dir = new File(path);
System.out.println(dir.mkdir());
}
//原文件中的数据
File[] fs = f.listFiles();
for (int i=0 ;i<fs.length ;i++ )
{
if (fs[i].isFile())
{
path = fs[i].getParent().replaceAll(s,s+"副本");
File fc = new File(path,fs[i].getName());
//文件创建之前 一定要保证路径存(文件所在的文件夹)在 否则抛异常
fc.createNewFile();
//将文件 复制到新文件中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fs[i]));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fc));
byte[] buf = new byte[1024];
int len=0;
while ((len=bis.read(buf,0,1024))!=-1)
{
bos.write(buf,0,len);
}
bos.close();
bis.close();
}
//是文件夹的话 创建文件夹副本
if (fs[i].isDirectory())
{
path = fs[i].getPath().replaceAll(s,s+"副本");;
File dir = new File(path);
//创建文件夹
dir.mkdir();
readDir(fs[i],lev);
}
}
}
public static void main(String[] args) throws Exception
{
File f = new File("F:\\0123");
Long start = System.currentTimeMillis();
new copyDir().readDir(f,0);
Long over = System.currentTimeMillis();
System.out.println("文件夹复制成功,耗时:"+(over-start));
}
}
转载于:https://blog.51cto.com/jiangzuun2014/1532185