一、背景
c++想读取Android中的文件可以将assets中的文件拷贝到sd卡中,然后c++就可以直接操作sd卡中的文件了。
二、代码实现
/**
* 是否有拷贝出错的文件
*/
var hasCopyFailedFile = false
/**
* 拷贝assets目录中的文件到sd卡
* @param context 上下文
* @param assetsPath assets 文件夹中的目录
* @param dstPath sd卡磁盘目录
*/
fun copyAssetsToSD(context: Context, assetsPath: String, dstPath: String): Boolean {
hasCopyFailedFile = false
copyAssetsToDst(context, assetsPath, dstPath)
return !hasCopyFailedFile
}
/**
* 递归拷贝Assets文件文件到SD卡
* @param context 上下文
* @param assetsPath assets 文件夹中的目录
* @param dstPath sd卡磁盘目录
*/
private fun copyAssetsToDst(context: Context, assetsPath: String, dstPath: String) {
try {
val assetsFileNames = context.assets.list(assetsPath)
val dstFile = File(dstPath)
if (assetsFileNames != null && assetsFileNames.isNotEmpty()) {
if (!dstFile.exists()) {
dstFile.mkdirs()
}
for (assetsFileName in assetsFileNames) {
if (assetsPath != "") {
// assets 文件夹下的目录
copyAssetsToDst(context, assetsPath + File.separator + assetsFileName, dstPath + File.separator + assetsFileName)
} else {
// assets 文件夹
copyAssetsToDst(context, assetsFileName, dstPath + File.separator + assetsFileName)
}
}
} else {
if (!dstFile.exists()) {
//当文件不存在的时候copy
val inputStream = context.assets.open(assetsPath)
val fileOutputStream = FileOutputStream(dstFile)
val buffer = ByteArray(1024)
var byteCount: Int
while (inputStream.read(buffer).also { byteCount = it } != -1) {
fileOutputStream.write(buffer, 0, byteCount)
}
fileOutputStream.flush()
inputStream.close()
fileOutputStream.close()
} else {
L.i("copyAssetsToDst", "文件已经存在:${dstFile.path}")
}
}
} catch (e: Exception) {
e.printStackTrace()
hasCopyFailedFile = true
}
}