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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:18:10