本来递归拷贝文件夹是很容易的, 但是Android的assets提供的接口没有文件操作那么方便, 昨天写了一个方法来实现把assets资源拷贝到指定目录,
/**
* copy assets to releaseDir with full path
*
* @author brian
* @param context
* @param assetsDir
* @param releaseDir
*/
public static void releaseAssets(Context context, String assetsDir,
String releaseDir) {
if (TextUtils.isEmpty(releaseDir)) {
return;
} else if (releaseDir.endsWith("/")) {
releaseDir = releaseDir.substring(0, releaseDir.length() - 1);
}
if (TextUtils.isEmpty(assetsDir) || assetsDir.equals("/")) {
assetsDir = "";
} else if (assetsDir.endsWith("/")) {
assetsDir = assetsDir.substring(0, assetsDir.length() - 1);
}
AssetManager assets = context.getAssets();
try {
String[] fileNames = assets.list(assetsDir);//只能获取到文件(夹)名,所以还得判断是文件夹还是文件
if (fileNames.length > 0) {// is dir
for (String name : fileNames) {
if (!TextUtils.isEmpty(assetsDir)) {
name = assetsDir + "/" + name;//补全assets资源路径
}
// Log.i("", "brian name=" + name);
String[] childNames = assets.list(name);//判断是文件还是文件夹
if (!TextUtils.isEmpty(name) && childNames.length > 0) {
releaseAssets(context, name, releaseDir);//递归, 因为资源都是带着全路径,
//所以不需要在递归是设置目标文件夹的路径
} else {
InputStream is = assets.open(name);
FileUtil.writeFile(releaseDir + "/" + name, is);
}
}
} else {// is file
InputStream is = assets.open(assetsDir);
// 写入文件前, 需要提前级联创建好路径, 下面有代码贴出
FileUtil.writeFile(releaseDir + "/" + assetsDir, is);
}
} catch (Exception e) {
e.printStackTrace();
}
}
级联创建folder
public static void checkFolderExists(String path) {
File file = new File(path);
if (file.exists() && !file.isDirectory() || !file.exists()) {
file.mkdirs();
}
}
自己写的优快云博客客户端