其实方法都差不多一定是用递归来的,你首先是要把思路理清楚。文件夹内可能嵌套很多文件夹,所以没嵌套一个文件夹就要调用一个复制文件的方法,然后把新的路径给它,具体你看我的代码,这是我做的一个android文件管理器的一部分复制文件的代码,很简单相信你一看就懂。
首先我们调用的一定是第一个方法,传入两个路径:1.需要复制的文件 2.复制到什么地方。
方法内判断如果是文件就调用pastefile()方法,这个方法会直接复制。
如果是文件夹就调用pastedir()方法,这个方法会去遍历文件夹下所有的文件然后再次做出判断是文件的就穿个paste()方法去直接复制,文件夹就再次递归,createfile()方法和creatdir方法都是配合pastefile()和pastedir()来使用的,这个我就不多说了。
public void paste(File copyFile, File file) throws IOException {
// TODO Auto-generated method stub
if(copyFile.isFile()&&file.isDirectory())
{
//如果是文件
pasteFile(copyFile,file);
}
else if(file.isDirectory())
{
//如果是文件夹
pasteDir(copyFile,file);
}
}
private void pasteDir(File copyFile, File file) throws IOException {
// TODO Auto-generated method stub
File newdir = creatDir(copyFile,file);
File files[] = copyFile.listFiles();
for(int i = 0 ; i < files.length ; i ++)
{
if(files[i].isFile())
{
paste(files[i], newdir);
}
else
{
pasteDir(files[i],newdir);
}
}
}
private File creatDir(File copyFile, File file) {
// TODO Auto-generated method stub
File newDir = new File(file,copyFile.getName());
newDir.mkdir();
return newDir;
}
private File createFile(File copyFile, File file) throws IOException {
// TODO Auto-generated method stub
File newFile = new File(file,copyFile.getName());
newFile.createNewFile();
return newFile;
}
private void pasteFile(File copyFile, File file) throws IOException {
File newfile = createFile(copyFile,file);
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
try {
// 新建文件输入流并对它进行缓冲
inBuff = new BufferedInputStream(new FileInputStream(copyFile));
// 新建文件输出流并对它进行缓冲
outBuff = new BufferedOutputStream(new FileOutputStream(newfile));
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1) {
inBuff.read(b);
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
} finally {
// 关闭流
if (inBuff != null)
inBuff.close();
if (outBuff != null)
outBuff.close();
}
} |