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

VB.NET保存游戏时长时文件未更新及文件占用问题求助

问题分析与解决方案

核心问题原因

1. 替换文件内容无变化

  • 字符串是不可变类型,line.Replace()不会修改原变量line,而是返回一个新字符串,但你没把新字符串存入集合,等于白做修改。
  • File.ReadLines()返回的是延迟加载的IEnumerable(Of String),遍历它只是读取数据,无法修改原始集合内容,最后写入的还是初始的文件行。

2. 文件被占用无法写入

  • File.ReadLines()是延迟枚举,没完全遍历完之前不会释放文件句柄。直接用它作为写入操作的输入,会导致文件被当前读取进程占用,无法完成写入。

修正后的代码

Private Sub SaveGameTime()
    ' 用Path.Combine正确拼接路径,避免字符串拼接的路径错误
    Dim fullpath = Path.Combine(Application.StartupPath, "content", "main", "userdata", "gametime.txt")
    ' 一次性读取所有行到List,立即释放文件句柄,同时方便修改内容
    Dim fileLines = File.ReadAllLines(fullpath).ToList()
    Dim newEntry = $"{tbGameName.Text} : {LBtimeout.Text}"
    Dim entryFound = False

    ' 遍历找到匹配行并替换
    For i = 0 To fileLines.Count - 1
        If fileLines(i).Contains(tbGameName.Text) Then
            fileLines(i) = newEntry
            entryFound = True
            Exit For ' 仅修改第一个匹配项,需修改所有匹配项可删除此行
        End If
    Next

    If entryFound Then
        ' 覆盖写入原文件,此时文件句柄已释放,无占用问题
        File.WriteAllLines(fullpath, fileLines)
    Else
        ' 未找到匹配项则追加新行
        File.AppendAllLines(fullpath, {newEntry})
    End If
End Sub

关键修改说明

  • 替换File.ReadLines()为File.ReadAllLines().ToList():一次性把文件内容读入内存集合,立即释放文件句柄,既解决占用问题,又支持直接修改指定行。
  • 直接修改List元素:通过索引定位匹配行,将新字符串赋值给对应位置,确保修改生效。
  • 用字符串插值$""替代+拼接:代码更简洁,避免字符串拼接的潜在错误。
  • 匹配后退出循环:如果只需要修改第一个匹配行,这样更高效;若要修改所有匹配行,删除Exit For即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:42:24