You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin无法列出指定目录文件问题求助

问题解决:Android中读取指定目录文件失败

你的核心问题是路径使用错误,Android的文件系统有严格的分区和访问规则,直接用相对路径com/example/readfiles/files无法定位到目标目录。根据你的需求,分以下几种常见场景给出修复方案:

场景1:目标文件夹在assets目录下

如果你的files文件夹是放在项目的src/main/assets目录中,不能用File类直接访问,需要通过AssetManager读取:

修改代码如下,注意在Composable中获取上下文:

@Composable
fun ReadJSFilesButton() {
    val context = LocalContext.current
    Button(
        onClick = { readFromAssets(context) }
    ) {
        Text(text = "get files")
    }
}

fun readFromAssets(context: Context) {
    val assetManager = context.assets
    try {
        val fileNames = assetManager.list("files") ?: emptyArray()
        if (fileNames.isEmpty()) {
            println("No files found in assets/files directory.")
            return
        }
        fileNames.forEach { fileName ->
            println(fileName)
        }
    } catch (e: IOException) {
        println("Failed to read assets directory: ${e.message}")
    }
}

场景2:目标文件夹在应用内部存储中

如果你的files文件夹是应用内部存储的子目录(比如/data/data/com.example.readfiles/files/files),需要通过上下文获取内部存储路径:

@Composable
fun ReadJSFilesButton() {
    val context = LocalContext.current
    Button(
        onClick = { readFromInternalStorage(context) }
    ) {
        Text(text = "get files")
    }
}

fun readFromInternalStorage(context: Context) {
    val directory = File(context.filesDir, "files")
    // 先检查目录是否存在,不存在则创建
    if (!directory.exists()) {
        directory.mkdirs()
        println("Directory created: ${directory.path}")
        return
    }
    val files = directory.listFiles()?.filter { it.isFile }
    files?.forEach { file ->
        println(file.name)
    } ?: println("No files found in internal storage directory.")
}

场景3:目标文件夹在外部存储中

如果你的files文件夹在外部存储(比如SD卡),需要先申请存储权限,再通过上下文获取外部存储路径:

  1. 在AndroidManifest.xml中添加权限(Android 13+需适配更细粒度权限):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  1. 代码实现:
@Composable
fun ReadJSFilesButton() {
    val context = LocalContext.current
    val permissionState = rememberPermissionState(android.Manifest.permission.READ_EXTERNAL_STORAGE)
    Button(
        onClick = {
            if (permissionState.hasPermission) {
                readFromExternalStorage(context)
            } else {
                permissionState.launchPermissionRequest()
            }
        }
    ) {
        Text(text = "get files")
    }
}

fun readFromExternalStorage(context: Context) {
    // 获取应用专属外部存储目录,无需额外权限(Android 10+)
    val directory = File(context.getExternalFilesDir(null), "files")
    if (!directory.exists()) {
        directory.mkdirs()
        println("Directory created: ${directory.path}")
        return
    }
    val files = directory.listFiles()?.filter { it.isFile }
    files?.forEach { file ->
        println(file.name)
    } ?: println("No files found in external storage directory.")
}

额外检查点

  • 确认你的files文件夹实际存在于对应的存储位置,路径拼写完全一致
  • 针对Android 10及以上版本,外部存储推荐使用应用专属目录,避免权限问题
  • 测试时可以通过println(directory.path)打印实际路径,对比是否和预期一致

内容的提问来源于stack exchange,提问作者Javi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:32:36