之前的代码存在bug:若给定的是文件就会出错
以下是修正后的,可以对比:
代码
import java.io.*;
/**拷贝文件夹
*
*/
public class Homework2 {
public static void main(String[] args) {
//该文件夹中所有内容拷贝:不包括02-javaSE这个文件夹名
File srcFile = new File("D:\\java\\javaProjects\\02-javaSE");
//盘符下不能直接复制文件
//随便写了个文件夹a,不存在的文件夹也可
File desFile = new File("D:\\a");
copyDir(srcFile, desFile);
}
/**
* 拷贝文件夹
* @param srcFile 要拷贝的文件夹绝对路径
* @param desFile 拷贝目标绝对路径
*/
private static void copyDir(File srcFile, File desFile) {
if (srcFile.isFile()){
//文件夹不存在,要先创建文件夹
if (!desFile.exists()){
desFile.mkdirs();
}
//如果是一个file那么必须得写一个文件名才能复制,否则会报拒绝访问,因为不可以直接在文件夹下复制,要在文件内复制
//在D:\java下复制文件SuperTest01.java如何写才行??
//desFile = D:\java\SuperTest01.java,程序方能成功运行,而此时是D:\java---->拒绝访问!
copyFile(srcFile, new File(desFile, srcFile.getName()));
}else{//是一个文件夹
//首先要将该文件夹名复制于目标目录下
new File(desFile ,srcFile.getName()).mkdir();
String[] files = srcFile.list();
for (String childFile : files){
File srcChildFile = new File(srcFile, childFile);
copyDir(srcChildFile, desFile);
}
}
}
private static void copyFile(File srcFile, File desFile) {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(srcFile);
os = new FileOutputStream(desFile);
byte[] bytes = new byte[1024*1024]; // 1MB
int length = 0;
while ((length = is.read(bytes)) != -1){
os.write(bytes, 0, length);
}
os.flush();
} catch (FileNotFoundException exception) {
exception.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}