android 通过uri获取文件大小,uri获取文件长度
程序员文章站
2024-02-14 16:31:34
...
通过uri获取文件大小有三种方法,一种是通过FileDescriptor获取
fun length(context: Context, uri: Uri): Long =
when (uri.scheme) {
ContentResolver.SCHEME_FILE -> File(uri.path).length()
ContentResolver.SCHEME_CONTENT -> try {
context.contentResolver.openFileDescriptor(uri, "r")?.statSize ?: 0
} catch (e: Exception) {
0L
}
else -> 0L
}
这种方法由于需要逐个转io流,在批量操作时比较耗时,建议在文件数量少时使用
android10之后,虽然无法直接操作沙盒目录外的其他文件,但读取文件的部分数据还是可以的
所以另一种文件是直接读取文件的长度
fun length(context: Context, uri: Uri): Long =
when (uri.scheme) {
ContentResolver.SCHEME_FILE -> File(uri.path).length()
ContentResolver.SCHEME_CONTENT -> {
val cr = context.contentResolver
val cursor = cr.query(uri, null, null, null, null)
if(cursor != null && cursor.moveToFirst()){
File(cursor.getString(cursor.getColumnIndex("_data"))).length()
}else 0
}
else -> 0L
}
这种方法需要查询数据库,建议在批量查询文件时使用
最后一种是通过查询uri列数据获取
val cursor = context.contentResolver.query(uri, null, null, null, null)
if(cursor != null && cursor.moveToFirst()){
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
if(!cursor.isNull(sizeIndex)){
val length = cursor.getLong(sizeIndex)
}
}
但是这种方法如果文件不存在,获取的长度会出错,因此不建议用