欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)
            }
        }

但是这种方法如果文件不存在,获取的长度会出错,因此不建议用