Kotlin中修复重复文件名递增编号功能(支持多文件)
问题修复方案
原代码核心问题
- 创建文件时错误使用原始
fileName而非计算后的新文件名,导致每次都覆盖第一个文件 - 固定的
counter无法动态适配已存在的带编号文件数量 - 缺少实际创建文件的逻辑,文件并未真正写入磁盘
- 存在语法错误(如
Modifier.fillMaxSize未加括号、onClick中未调用createFile方法)
修复后的完整代码
// In The Main Activity Of A Jetpack Compose Project In Android Studio // 目录:用mkdirs()确保父目录存在(更稳妥) val directory = File(this.filesDir, "Directory") directory.mkdirs() // 目录文件列表 var fileList by mutableStateOf<List<File>>(directory.listFiles()?.toList() ?: listOf()) // 基础文件名 val fileName = "File Name" // 创建文件的方法 fun createFile() { // 统计目录下所有匹配"File Name"或"File Name X"格式的文件数量 val existingMatchCount = directory.listFiles { file -> val baseNamePattern = Regex("^$fileName( \\d+)?$") baseNamePattern.matches(file.name) }?.size ?: 0 // 生成新文件名:无匹配则用原名,有匹配则加递增编号 val newFileName = if (existingMatchCount == 0) { fileName } else { "$fileName ${existingMatchCount + 1}" } // 创建文件(关键:使用生成的新文件名) val file = File(directory, newFileName) file.createNewFile() // 实际写入磁盘,否则文件不会真正存在 // 更新文件列表触发Compose重组 fileList = directory.listFiles()?.toList() ?: listOf() } // 布局 Column( modifier = Modifier.fillMaxSize() ) { // 添加文件按钮 Button(onClick = { createFile() }) { Text(text = "Add File") } // 展示文件列表 fileList.forEach { file -> Text(text = file.name) } }
关键改动说明
- 动态计算编号:通过正则匹配统计所有同名(含编号)的文件,确保编号随已有文件数量准确递增
- 正确使用新文件名:创建文件时使用生成的
newFileName,彻底避免覆盖原有文件 - 补充文件创建逻辑:添加
file.createNewFile()确保文件实际写入磁盘 - 修复语法错误:修正
Modifier.fillMaxSize()和onClick中的调用问题
内容的提问来源于stack exchange,提问作者Bob Rasner
相关产品推荐
相关产品推荐

