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

如何在Kotlin中创建文件和目录?Android Studio创建目录失败求助

问题分析与解决方案

首先要明确一个核心问题:你尝试创建的/data/Ziemniak/是Android系统的核心目录,这个目录属于系统分区,只有拥有Root权限或者系统签名的应用才能对其进行写入操作——哪怕你申请了常规的存储权限,普通应用也没有权限直接在这里创建文件夹,这就是你失败的根本原因。

接下来给你几个可行的替代方案,根据你的需求选择:

方案1:使用应用专属内部存储(推荐,隐私性好)

应用专属内部存储的路径是/data/data/你的应用包名/files/,其他应用无法访问,卸载应用时会自动删除,不需要申请额外权限。创建代码如下:

val button = findViewById<Button>(R.id.buttonNoweZamowienie)
button.setOnClickListener {
    val folder = File(filesDir, "Ziemniak")
    if (!folder.exists()) {
        val isCreated = folder.mkdirs()
        if (isCreated) {
            Toast.makeText(this, "文件夹创建成功", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "文件夹创建失败", Toast.LENGTH_SHORT).show()
        }
    } else {
        Toast.makeText(this, "文件夹已存在", Toast.LENGTH_SHORT).show()
    }
}

方案2:使用应用专属外部存储(适合需要和其他应用共享但卸载后可删除)

这个路径在外部存储的Android/data/你的应用包名/files/下,同样不需要申请存储权限,卸载应用时会被删除。代码示例:

val button = findViewById<Button>(R.id.buttonNoweZamowienie)
button.setOnClickListener {
    val externalFilesDir = getExternalFilesDir(null)
    externalFilesDir?.let { dir ->
        val folder = File(dir, "Ziemniak")
        val isCreated = folder.mkdirs()
        Toast.makeText(this, if (isCreated) "创建成功" else "创建失败", Toast.LENGTH_SHORT).show()
    } ?: run {
        Toast.makeText(this, "外部存储不可用", Toast.LENGTH_SHORT).show()
    }
}

方案3:使用公共外部存储(需特殊权限,Android 10+限制严格)

如果你一定要在外部存储的公共区域创建文件夹(比如/storage/emulated/0/Ziemniak/),需要注意:

  • Android 9及以下:需要申请WRITE_EXTERNAL_STORAGE权限,并且要动态申请。
  • Android 10+:需要申请MANAGE_EXTERNAL_STORAGE权限,还要引导用户到系统设置中开启这个权限(因为这个权限是敏感权限,不能通过常规动态申请流程获取)。

代码示例(仅作参考,不推荐随意使用):

// 先检查权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Environment.isExternalStorageManager()) {
        val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
        intent.data = Uri.parse("package:" + packageName)
        startActivity(intent)
        return@setOnClickListener
    }
} else {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 100)
        return@setOnClickListener
    }
}

// 权限通过后创建文件夹
val folder = File(Environment.getExternalStorageDirectory(), "Ziemniak")
val isCreated = folder.mkdirs()
Toast.makeText(this, if (isCreated) "创建成功" else "创建失败", Toast.LENGTH_SHORT).show()

最后给你几个调试建议:

  • 调用mkdirs()后一定要检查返回值,它会直观告诉你是否创建成功。
  • 可以添加try-catch块捕获可能的异常(比如SecurityException),方便排查问题。
  • 用Log打印你要创建的路径,确认路径是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:21:36