android 文件拷贝源代码

一:  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.   在调试过程中,代码创建的文件,通过电脑可能无法浏览文件(但文件已经存在与调试机器中,重启调试设备就可以看 到文件)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值