文件拷贝

249 阅读1分钟

1.拷贝assets目录下的文件,到指定目录,一般是将assets目录下文件,先拷贝到对应app的cache目录下,然后再拷贝到指定目录,具体操作如下

private fun getAssetFilePath(fileName: String, file: Boolean = true): String {  
    val assetManager = assets  
    try {  
            val inputStream: InputStream = assetManager.open(fileName)  
            val cacheDir: File = application.cacheDir  
            val outputFile = File(cacheDir, fileName)  
            val outputStream: OutputStream = FileOutputStream(outputFile)  
            val buffer = ByteArray(1024)  
            var length: Int  
            while (inputStream.read(buffer).also { length = it } > 0) {  
            outputStream.write(buffer, 0, length)  
        }  
        outputStream.close()  
        inputStream.close()  
        // 在这里使用绝对路径  
        return outputFile.absolutePath  
    } catch (e: IOException) {  
        e.printStackTrace()  
    }  

    return ""  
}

// 拷贝到externalFiles目录下的子目录
@RequiresApi(Build.VERSION_CODES.O)  
private fun saveToFile(srcFilePath: String, parentDir: String, fileName: String) {  
    val filePath = application.getExternalFilesDir(null)?.path  
    val externalFile = File("$filePath/$parentDir")  
    if (!externalFile.exists()) {  
        externalFile.mkdirs()  
    }  
    val sourceFile = File(srcFilePath)  
    val destinationFile = File("$externalFile/$fileName")  

    Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING)  
    println("File copied from $srcFilePath to $destinationFile")  
}

/**  
* 拷贝至files目录下  
*/  
fun copyFile(sourceFile: File, destFileName: String) {  
    val parentDir = application.getExternalFilesDir(null)?.path  
    val destFile = File("$parentDir/$destFileName")  
    val inputStream = FileInputStream(sourceFile)  
    val outputStream = FileOutputStream(destFile)  
    val buffer = ByteArray(1024)  
    var length: Int  
    while (inputStream.read(buffer).also { length = it } > 0) {  
        outputStream.write(buffer, 0, length)  
    }  
    inputStream.close()  
    outputStream.close()  
}