复制目录,包括深层所有文件 java

在控制台显示:

复制的文件目录  



代码如下:

package Jobday14_作业_复制目录;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        System.out.println("请输入你想要复制的目录:");
        String s = new Scanner(System.in).nextLine();
        File file = new File(s);
        if (!file.isDirectory()) {               //判断输入的格式
            System.out.println("请输入目录");
            return;

        }
        File dir = copyMulu(file);
        try {
            copy(file, dir);       //复制目录的方法
            System.out.println("复制成功");
        } catch (Exception e) {
            System.out.println("复制失败");
            e.printStackTrace();
        }
    }

    private static void copy(File file, File dir) throws Exception {        //复制目录的方法
        File[] files = file.listFiles(); // 目录列表
        for (File f : files) {       //遍历files数组
             if (f.isFile()) { // f是文件
                FileInputStream in = new FileInputStream(f);
                FileOutputStream out = new FileOutputStream(new File( subfilePath(f, dir, file)));
                byte[] buff = new byte[8192];
                int n;
                while ((n = in.read(buff)) != -1) {
                    out.write(buff, 0, n);
                }
                in.close();
                out.close();
            } else { // f是目录
                File dir1 = new File(
                        dir.getAbsolutePath() + f.getAbsolutePath().substring(file.getAbsolutePath().length()));
                dir1.mkdirs();// 创建新的目录
                copy(f, dir1);
            }
        }
    }

    // 子文件的路径
    private static String subfilePath(File f, File dir, File file) {
        return dir.getAbsolutePath() + f.getAbsolutePath().substring(file.getAbsolutePath().length());
    }


    // 准备 存放复制目录的路径
    private static File copyMulu(File file) {
        File dir = new File(file.getAbsolutePath() + "-copy");
        if (!dir.exists()) { // 判断情况,看看路径是否存在
            dir.mkdirs(); // 没有直接创建
        } else { // 有遍历删除目录
            clear(dir);
        }
        return dir;
    }

    // 删除存在的目录
    private static void clear(File dir) {
        File[] files = dir.listFiles();
        if (files == null) {
            return;
        }
        for (File f : files) {
            if (f.isFile()) {
                f.delete();
            } else {
                clear(f);
                f.delete();
            }
        }
    }
}


PLus版

package Job20180602_job;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Test2 {
	public static void main(String[] args) {

		File fileIn = inPath();
		File fileOut;
		do {
			fileOut = outPath(fileIn);
			if (fileOut != null) {
				break;
			}
			System.out.println("输入非法的目录格式");
		} while (fileOut == null);

		try {
			System.out.println("复制中。。。");
			copy(fileIn, fileOut);
			System.out.println("复制完成");
		} catch (Exception e) {
			System.out.println("复制失败");
			e.printStackTrace();
		}
	}

	private static void copy(File fileIn, File fileOut) throws Exception {
		File[] inFiles = fileIn.listFiles();
		for (File f : inFiles) {
			if (f.isFile()) {
				FileInputStream in = new FileInputStream(f);
				FileOutputStream out = new FileOutputStream(new File(subFilePath(f, fileOut, fileIn)));
				byte[] buff = new byte[8192];
				int n;
				while ((n = in.read(buff)) != -1) {
					out.write(buff, 0, n);
				}
				in.close();
				out.close();
			} else {
				File fileOut1 = new File(
						fileOut.getAbsolutePath() + f.getAbsolutePath().substring(fileIn.getAbsolutePath().length()));
				fileOut1.mkdirs();
				copy(f, fileOut1);
			}
		}
	}

	private static String subFilePath(File f, File fileOut, File fileIn) {
		return fileOut.getAbsolutePath() + f.getAbsolutePath().substring(fileIn.getAbsolutePath().length());
	}

	private static File inPath() {
		File fileIn = null;
		do {
			System.out.println("请输入要复制的目录:");
			String sIn = new Scanner(System.in).nextLine();
			String sIn1 = sIn.replace("\\\\", "/");
			fileIn = new File(sIn1);
			if (!fileIn.isDirectory()) {
				System.out.println("请重新输入正确的目录");
				continue;
			}
			break;
		} while (true);
		System.out.println("要复制的目录为: " + fileIn.getAbsolutePath());
		return fileIn;
	}

	private static File outPath(File fileIn) {
		do {
			File fileOut = null;
			System.out.println("请输入要保存的目录:");
			String sOut = new Scanner(System.in).nextLine();
			String sOut1 = sOut.replace("\\\\", "/");
			fileOut = new File(sOut1);
			if (!fileOut.isDirectory()) {

				return null;
			}
			System.out.println("保存的目录为: " + fileOut.getAbsolutePath());

			// 截取in out 文件路径
			String[] Ins = fileIn.getAbsolutePath().split("\\\\");
			String[] Outs = fileOut.getAbsolutePath().split("\\\\");

			int n = 0; // 目录相同
			if (Ins.length == Outs.length) {
				for (int i = 0; i < Ins.length; i++) {
					if (!Ins[i].equals(Outs[i])) {
						n = 1; // 保存目录 长度一样 但内容不同
						break;
					}
				}
			} else {
				for (int i = 0; i < (Ins.length < Outs.length ? Ins.length : Outs.length); i++) {
					if (Ins.length > Outs.length) {
						n = 2; // 保存目录短 内容一样 父目录
					} else {
						n = 3; // 保存目录长 内容一样 子目录
					}

					if (!Ins[i].equals(Outs[i])) {
						n = 4; // 长度不一样,内容不同
						break;
					}
				}
			}

			File fileOut1 = null;
			switch (n) {
			case 0:
				fileOut1 = new File(fileOut.getAbsolutePath() + "-副本");
				System.out.println(fileOut1.getAbsolutePath());
				test(fileOut1);
				return fileOut1;
			case 1:
				fileOut1 = new File(fileOut.getAbsolutePath());
				System.out.println(fileOut1.getAbsolutePath());
				test(fileOut1);
				return fileOut1;
			case 2:
				System.out.println("非法---输入的保存目录为父目录,请重新输入");
				break;
			case 3:
				System.out.println("非法---输入的保存目录为子目录,请重新输入");
				break;
			case 4:
				fileOut1 = new File(fileOut.getAbsolutePath());
				System.out.println(fileOut1.getAbsolutePath());
				test(fileOut1);
				return fileOut1;

			default:
				break;
			}

		} while (true);
	}

	private static void test(File fileOut1) {

		if (fileOut1.isDirectory()) {
			System.out.println("保存目录已存在!");
			System.out.println("请选择:1 清除已有的,重新复制 ; 2 创建副本 ");
			int n = new Scanner(System.in).nextInt();
			if (n == 1) {
				deleteOut(fileOut1);
				System.out.println("已清除" + fileOut1.getAbsolutePath() + "内容");
				System.out.println("可以开始复制");
			} else {
				System.out.println("开始创建新目录");
				fileOut1 = new File(fileOut1.getAbsolutePath() + "1");
				System.out.println(fileOut1.getAbsolutePath() + "创建成功");
				System.out.println("可以开始复制");
			}
		}
	}

	private static void deleteOut(File fileOut1) {

		File[] files = fileOut1.listFiles();
		if (files == null) {
			return;
		}
		for (File f : files) {
			if (f.isFile()) {
				f.delete();
			} else {
				deleteOut(f);
				f.delete();
			}
		}
	}

}


发布了21 篇原创文章 · 获赞 3 · 访问量 6562

猜你喜欢

转载自blog.csdn.net/MADMY/article/details/80542673