一: Androidmanifest.xml 中添加文件操作权限
<!-- 往SDCard写入数据权限 -->
<!-- 如果你的项目要使用到对sd卡的创建和删除等操作的时候需要添加该权限 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
二: 拷贝代码
package com.update.mapdata.fundrive.dataupdate;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
/**
* 复制指定文件夹下的所有文件和嵌套文件,并保持原来的结构不变,
* 以百分比显示复制进度,保留两位小数
* @author zuofeng.site
* @ f1 代表源文件
* @ f2 目标文件
*/
public class CopyFileUtil {
public static void copyDirectoryOrFileToDirectory(File f1,File f2) throws IOException{
List<String> list = getAllFilePath(f1);
int num = list.size();//总文件路径数目
Log.i("copypath", "File list size: " + num);
double count = 0.0;
for (String s : list) {
Log.i("copypath", "copy file start");
File path = new File(s);
String name = path.getPath();//获取源文件路径
String newName=name.replace(f1.getParent(),f2.getPath());//设置复制后的新路径
File newFile= new File(newName);
if(path.isDirectory()){//空文件夹创建绝对路径
boolean b = newFile.mkdirs();
if(b){
count++;
double d=count/num;//把已经复制的文件数量作为显示进度的参数
}else{
Log.e("copypath", "mkdirs false:" + path.getPath());
}
}
if(path.isFile()){
int i = newName.lastIndexOf("/");
String temppath = newName.substring(0, i);
File ftemp= new File(temppath);
if(!ftemp.exists()){
ftemp.mkdirs();
}
if(!newFile.exists()){
boolean b = newFile.createNewFile();
//目标创建成功,开启流
if(b){
Log.i("copypath", "Stream start");
boolean result=copyFile(path, newFile);
Log.i("copypath", "Stream end");
if(result){
count++;
double d=count/num;
}else{
Log.e("copypath", "Stream false:" + path.getPath());
}
}
}
}
Log.i("copypath", "copy file end");
}
}
/**
* 创建复制内容的流方法
* @param sourceFile 源文件
* @param targetFile 目标文件
* @return 返回值代表流程序是否复制完成
* @throws IOException 抛出IO传输异常
*/
public static boolean copyFile(File sourceFile,File targetFile) throws IOException{
// 新建文件输入流并对它进行缓冲
FileInputStream input = new FileInputStream(sourceFile);
BufferedInputStream inBuff=new BufferedInputStream(input);
// 新建文件输出流并对它进行缓冲
FileOutputStream output = new FileOutputStream(targetFile);
BufferedOutputStream outBuff=new BufferedOutputStream(output);
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len =inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
//关闭流
inBuff.close();
outBuff.close();
output.close();
input.close();
return true;
}
/**
* 获取源文件下所有文件的绝对路径,存放在list中
* @param file 源文件
* @return 返回值代表源文件下所有文件的绝对路径
*/
public static List<String> getAllFilePath(File file){
List<String> list=new ArrayList<String>();
if(!file.exists()) {
return list;
}
if(file.isDirectory()){//如果文件是目录
File[] files=file.listFiles();//把目录下所有目录和文件存在数组中
if(file.length()>0){//该目录非空
for (File f : files) {//遍历数组内所有对象
if(f.isDirectory()){//如果还是目录
List<String> mlist=getAllFilePath(f);//调用自身方法循环
list.addAll(mlist);//将每一个子目录文件夹添加到list集合中
}else{//如果遍历出来是文件
list.add(f.getPath());//将文件路径存入list集合
}
}
}else{//如果目录为空
list.add(file.getPath());//将空目录路径添加到list集合
}
}else{//如果传进来的file对象是文件
list.add(file.getPath());//将文件路径添加到list集合
}
return list;
}
}
三: 注意事项:
1. 在调试过程中,代码创建的文件,通过电脑可能无法浏览文件(但文件已经存在与调试机器中,重启调试设备就可以看 到文件)