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
相关产品推荐
相关产品推荐

