如何在C# WinForms中反序列化Steam的libraryfolders.vdf并管理库
处理Steam libraryfolders.vdf的C# WinForms解决方案
一、正确解析VDF文件
Steam的VDF是专属键值格式,并非JSON,用Newtonsoft.Json解析必然报错;GameLoop.VDF大概率是用法有误。推荐使用Vdf.Net库(可通过NuGet安装),它专门适配Valve的VDF格式。
1. 安装依赖
在NuGet包管理器中搜索Vdf.Net安装,或通过Package Manager Console执行:
Install-Package Vdf.Net
2. 定义实体类
无需复杂结构,用简单类存储库信息即可:
public class SteamLibrary { public string Id { get; set; } public string Path { get; set; } }
3. 解析VDF文件
using Vdf.Net; // 替换为你的Steam安装目录路径 string steamInstallPath = @"C:\Program Files (x86)\Steam"; string vdfPath = Path.Combine(steamInstallPath, "steamapps", "libraryfolders.vdf"); // 反序列化VDF内容 var vdfData = VdfConvert.Deserialize(File.ReadAllText(vdfPath)); var libraryNode = vdfData.Value["libraryfolders"] as VdfObject; List<SteamLibrary> libraries = new List<SteamLibrary>(); foreach (var node in libraryNode.Children) { if (node.Value is VdfObject libraryObj && libraryObj.TryGetValue("path", out var pathValue)) { libraries.Add(new SteamLibrary { Id = node.Key, Path = pathValue.ToString() }); } }
二、在DataGridView中展示数据
1. 绑定数据源
// 假设DataGridView控件名为dgvSteamLibraries dgvSteamLibraries.AutoGenerateColumns = false; // 添加自定义列 dgvSteamLibraries.Columns.Add(new DataGridViewTextBoxColumn { Name = "IdColumn", HeaderText = "库ID", DataPropertyName = "Id" }); dgvSteamLibraries.Columns.Add(new DataGridViewTextBoxColumn { Name = "PathColumn", HeaderText = "库路径", DataPropertyName = "Path", Width = 400 }); // 绑定数据集合 dgvSteamLibraries.DataSource = libraries;
三、实现库文件夹的添加与删除
1. 添加非默认库
public void AddNewLibrary(string targetPath) { // 验证路径有效性 if (!Directory.Exists(targetPath)) Directory.CreateDirectory(Path.Combine(targetPath, "steamapps")); // 获取新库ID(当前最大ID+1) int maxId = libraries.Select(l => int.Parse(l.Id)).Max(); string newId = (maxId + 1).ToString(); // 更新VDF对象 var libraryNode = vdfData.Value["libraryfolders"] as VdfObject; libraryNode.Add(newId, new VdfObject { {"path", targetPath}, {"label", ""}, {"contentid", ""}, {"totalsize", 0}, {"apps", new VdfObject()} }); // 保存修改后的VDF文件 File.WriteAllText(vdfPath, VdfConvert.Serialize(vdfData, VdfSerializationFormat.ValveKeyValue)); // 更新界面数据 libraries.Add(new SteamLibrary { Id = newId, Path = targetPath }); dgvSteamLibraries.Refresh(); }
2. 删除非默认库
public void RemoveLibrary(string libraryId) { // 禁止删除默认库(默认库ID通常为"0") if (libraryId == "0") return; var libraryNode = vdfData.Value["libraryfolders"] as VdfObject; if (libraryNode.ContainsKey(libraryId)) { libraryNode.Remove(libraryId); // 保存修改 File.WriteAllText(vdfPath, VdfConvert.Serialize(vdfData, VdfSerializationFormat.ValveKeyValue)); // 更新界面数据 var targetLib = libraries.First(l => l.Id == libraryId); libraries.Remove(targetLib); dgvSteamLibraries.Refresh(); } }
四、关键注意事项
- 操作VDF文件前务必备份,防止损坏Steam配置
- 修改配置后需要重启Steam才能生效
- 确保程序拥有Steam目录的读写权限,建议以管理员身份运行
- 添加库时需验证路径是否已存在于库列表中,避免重复添加
内容的提问来源于stack exchange,提问作者Atheer Salah
相关产品推荐
相关产品推荐

