* 复制一个文件夹到另一个目录下.
复制文件夹,首先需要想到递归.因为文件夹是一个层次目录.
其次,如何递归呢?递归什么?当然,只有是文件夹的时候才递归,那么判断是文件夹还是文件就是必要的.是文件夹就递归,是文件就用流读写.
再次,文件夹的命名和文件的命名.两者都需要在旧文件名称和新文件路径命名.我们需要知道,当旧文件夹通过listFiles获得下一级文件时候,这时候,我们就要想到,
新文件夹和旧文件夹的路径已经相差一级了.
思考:
该题的难点就在于新旧文件和文件夹的路径层次同步问题.每当listFiles之后,新旧文件或文件夹就有了一个层次的差距,具体如何补足这一个层次差,只要知道 --
旧文件名称和新文件路径命名 -- 就可以了.
* */
public class Demo02 {
public static void main(String[] args) throws IOException{
File oldFile = new File("c:\\aaa");
File newFile = new File("e:\\");
MyCopy(oldFile,newFile);
}
public static void MyCopy(File oldFile,File newFile) throws IOException
{
if(!oldFile.exists()) //判断源文件是不是存在,如果不存在,声明.
{
System.out.println("文件不存在");
}
//新的目录,加上旧的文件名.就成了一个新的文件.但是此时还没有具体文件.
File f = new File(newFile.getPath() + "\\" + oldFile.getName());
System.out.println("f:"+f);
f.mkdir(); //创建新的文件夹 &&&重要的一部分.这里是建立一个具体的文件夹,此时新旧文件夹都相同了.
File[] files = oldFile.listFiles(); //列出旧文件夹里的所有文件.
for(File file : files) //遍历这个文件夹里面的文件..
{
if(file.isDirectory()) //如果还是文件夹,就递归.
{
MyCopy(file,f);
}else //否则就可以,用IO流来读写文件了.
{
BufferedInputStream bis = new BufferedInputStream(new
FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(f.getPath() + "\\" + file.getName()));
int b = 0;
while((b= bis.read())!= -1)
{
bos.write(b);
}
bis.close();
bos.close();
System.out.println(file.getName() + " 拷贝完成!");
}
}
}
}
|
|