[原创]安卓复制assets目录下的文件及文件夹(1)

来源:互联网 发布:淘宝图片处理软件 编辑:程序博客网 时间:2024/04/29 10:05
声明:本博客带有[原创]标志的均为原创文章,转载时请注明出处http://blog.sina.com.cn/felonwan并声明作者felonwan。

参考资料:
http://android.9tech.cn/news/2013/1125/38867.html
http://my.oschina.net/haquanwen/blog/54746

在网上找了一些方法,但是测试时都有问题。本文下面的代码主要来自第一个网址,但是修正了其把空文件当成目录、以及不能复制没有后缀的文件的bug,另外添加返回值显示复制是否成功。有什么问题请在下面回复,有什么错误也请在下面回复指正。

在4.2.2上测试的结果是:对于空目录,由于安卓的AssetManager不能列出,所以无法复制!如果有很重要的空目录需要复制,请使用压缩包或其它方法解决。

注意:如果是复制到/data分区中的apk文件指定的数据存储区,请使用Context.getFilesDir().getPath(),比如在MainActivity.java的OnCreate里使用this.getFilesDir().getPath()。(笔者还不明白这个Context到底该怎么引用。另外,如果直接在MainActivity里直接使用没有语法错误,但运行时会出现闪退。)

首先,复制单个文件:
private Boolean CopyAssetsFile(String filename, String des) {
    Boolean isSuccess = true;
    //复制安卓apk的assets目录下任意路径的单个文件到des文件夹,注意是否对des有写权限
    AssetManager assetManager = this.getAssets();

   InputStream in = null;
   OutputStream out = null;
   try {
       in = assetManager.open(filename);
       String newFileName = des + "/" + filename;
       out = new FileOutputStream(newFileName);

       byte[] buffer = new byte[1024];
       int read;
       while ((read = in.read(buffer)) != -1) {
           out.write(buffer, 0, read);
       }
       in.close();
       in = null;
       out.flush();
       out.close();
       out = null;
    } catch (Exception e) {
      e.printStackTrace();
      isSuccess = false;
    }

    return isSuccess;

}

然后是文件夹的复制,需要调用上面的函数:
private Boolean CopyAssetsDir(String src,String des) {
  //复制安卓Assets下的“非空目录”到des文件夹,注意是否对des有写权限
  Boolean isSuccess = true;
  String[] files;
  try
  {
    files = this.getResources().getAssets().list(src);
  }
  catch (IOException e1)
  {
    return false;
  }

  if(files.length==0){
    isSuccess = CopyAssetsFile(src,des);//对于文件直接复制
    if(!isSuccess)
      return isSuccess;
  }
  else{
    File srcfile = new File(des+"/"+src);
    if(!srcfile.exists()){
      if(srcfile.mkdirs()){//对于目录自行创建
        for(int i=0;i<files.length;i++){//新浪博客的限制,这里的小于号请自行替换为英文的
          isSuccess = CopyAssetsDir(src + "/"+files[i], des);//递归调用
          if(!isSuccess)
            return isSuccess;
        }
      }
      else{
        return false;
      }
    }

  }
  return isSuccess;
}
0 0
原创粉丝点击