Android存储文件生成失败:目录已创建但无文件、无提示与日志
问题分析与修复方案
核心问题
1. 子目录路径错误
你创建的sd目录没有关联到之前的Notes目录,而是直接在默认路径(通常是App内部存储)创建,导致后续文件也存在了错误位置,自然在外部存储的Notes文件夹下找不到。
2. 权限未正确处理
- Android 6.0(API 23)及以上,需要动态申请
WRITE_EXTERNAL_STORAGE权限; - Android 10(API 29)及以上启用分区存储机制,直接写入公共目录需额外适配。
3. 缺乏错误捕获与日志输出
文件写入过程没有异常处理逻辑,失败后无任何提示,无法快速定位问题。
修复后的代码
// 先处理外部存储写入权限(Android 6.0+ 需动态申请) if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1001 ) return } val notesDir = File(Environment.getExternalStorageDirectory(), "Notes") var success = true // 用mkdirs替代mkdir,确保父目录不存在时也能创建 if (!notesDir.exists()) { success = notesDir.mkdirs() } if (success) { // 关键:将子目录关联到Notes目录下创建 val noteSubDir = File(notesDir, "${note.noteTitle}-${note.timeStamp}") if (!noteSubDir.exists()) { success = noteSubDir.mkdirs() } if (success) { val destFile = File(noteSubDir, note.noteTitle) try { PrintWriter(destFile).use { out -> out.println(note.noteDescription) } Toast.makeText(this, "文件保存成功", Toast.LENGTH_SHORT).show() } catch (e: Exception) { // 打印异常日志方便排查 e.printStackTrace() Toast.makeText(this, "文件写入失败:${e.message}", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(this, "子目录创建失败", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(this, "目录创建失败", Toast.LENGTH_SHORT).show() }
Android 10+ 适配建议
如果你的App目标SDK版本为29及以上,推荐使用应用专属外部存储目录,无需申请WRITE_EXTERNAL_STORAGE权限:
// 应用专属外部存储目录,系统会自动管理,卸载App时会删除 val notesDir = File(getExternalFilesDir(null), "Notes") // 后续目录创建、文件写入逻辑与上述代码一致
内容的提问来源于stack exchange,提问作者Gabriel Aguiar
相关产品推荐
相关产品推荐

