在控制台显示:
复制的文件目录
代码如下:
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();
}
}
}
}