重要说明
Steam 官方文档只公开了根路径的字符串名称。数字 Root ID (0-12) 在任何官方文档中都未公开,仅在remotecache.vdf文件中使用。
1. Steamworks 配置 (appinfo.vdf) 使用字符串名称定义根路径:
"savefiles"
{
"0"
{
"root" "WinAppDataLocal" // <--- 字符串标识
"path" "MyGame/Saves"
}
}2. 本地同步记录 (remotecache.vdf) 使用数字 ID 记录文件位置:
"MyGame/Saves/save.dat"
{
"root" "3" // <--- 数字标识
"size" "1024"
}本工具的"跳转到本地文件"功能需要将 remotecache.vdf 中的数字 Root ID 转换为实际的文件系统路径。官方未公开它们的对应关系,本文档通过实际游戏验证建立这个映射。
官方文档来源:https://partner.steamgames.com/doc/features/cloud
| Root 名称 | 平台 | 路径 |
|---|---|---|
App Install Directory |
All | [Steam]\steamapps\common\[Game]\ |
SteamCloudDocuments |
All | 见下方说明 |
WinMyDocuments |
Windows | %USERPROFILE%\My Documents\ |
WinAppDataLocal |
Windows | %USERPROFILE%\AppData\Local\ |
WinAppDataLocalLow |
Windows | %USERPROFILE%\AppData\LocalLow\ |
WinAppDataRoaming |
Windows | %USERPROFILE%\AppData\Roaming\ |
WinSavedGames |
Windows | %USERPROFILE%\Saved Games\ |
WindowsHome |
Windows | %USERPROFILE%\ |
MacHome |
macOS | ~/ |
MacAppSupport |
macOS | ~/Library/Application Support/ |
MacDocuments |
macOS | ~/Documents/ |
LinuxHome |
Linux | ~/ |
LinuxXdgDataHome |
Linux | $XDG_DATA_HOME/ |
LinuxXdgConfigHome |
Linux | $XDG_CONFIG_HOME/ |
AndroidExternalData |
Android | Android/data/<package>/files/ |
数据来源:数字 Root ID 与字符串名称的完整对应关系来自 Steam SDK 内部枚举
ERemoteStorageFileRoot(OpenSteamworks 镜像),路径映射则通过实际游戏测试和cloud_log.txt分析确认。
| Root ID | SDK 枚举名 | Root 名称 | 路径示例 |
|---|---|---|---|
| 0 | k_ERemoteStorageFileRootDefault |
Default |
{Steam}/userdata/{UID}/{AppID}/remote/ |
| 1 | k_ERemoteStorageFileRootGameInstall |
GameInstall |
{SteamInstall}/steamapps/common/{Game}/ |
| 2 | k_ERemoteStorageFileRootWinMyDocuments |
WinMyDocuments |
Win: %USERPROFILE%\Documents\ |
| 3 | k_ERemoteStorageFileRootWinAppDataLocal |
WinAppDataLocal |
Win: %LOCALAPPDATA%\ |
| 4 | k_ERemoteStorageFileRootWinAppDataRoaming |
WinAppDataRoaming |
Win: %APPDATA%\ |
| 5 | k_ERemoteStorageFileRootSteamUserBaseStorage |
SteamUserBaseStorage |
(用途待验证) |
| 6 | k_ERemoteStorageFileRootMacHome |
MacHome |
Mac: ~/ |
| 7 | k_ERemoteStorageFileRootMacAppSupport |
MacAppSupport |
Mac: ~/Library/Application Support/ |
| 8 | k_ERemoteStorageFileRootMacDocuments |
MacDocuments |
Mac: ~/Documents/ |
| 9 | k_ERemoteStorageFileRootWinSavedGames |
WinSavedGames |
Win: %USERPROFILE%\Saved Games\ |
| 10 | k_ERemoteStorageFileRootWinProgramData |
WinProgramData |
Win: %PROGRAMDATA%\ |
| 11 | k_ERemoteStorageFileRootSteamCloudDocuments |
SteamCloudDocuments |
见下方说明 |
| 12 | k_ERemoteStorageFileRootWinAppDataLocalLow |
WinAppDataLocalLow |
Win: %LOCALAPPDATA%Low\ |
| 13 | k_ERemoteStorageFileRootMacCaches |
MacCaches |
Mac: ~/Library/Caches/ |
| 14 | k_ERemoteStorageFileRootLinuxHome |
LinuxHome |
Linux: ~/ |
| 15 | k_ERemoteStorageFileRootLinuxXdgDataHome |
LinuxXdgDataHome |
Linux: $XDG_DATA_HOME/ |
| 16 | k_ERemoteStorageFileRootLinuxXdgConfigHome |
LinuxXdgConfigHome |
Linux: $XDG_CONFIG_HOME/ |
| 17 | k_ERemoteStorageFileRootAndroidSteamPackageRoot |
AndroidSteamPackageRoot |
Android: (待验证) |
| 18 | (枚举中未定义,可能为后续新增) | WindowsHome |
Win: %USERPROFILE%\ |
Root ID 在不同系统上的表现:
- Root ID 代表逻辑位置:例如 Root 2 始终代表 "Windows 我的文档"。
- 平台特异性:某些 Root ID 仅在特定平台有效(如
Win...在 Windows,Mac...在 macOS)。 - 跨平台同步:如果游戏在 Windows 上使用了 Root 2 (
WinMyDocuments) 存储存档,而在 macOS 上希望同步到~/Documents(Root 8),开发者需要在 Steamworks 的 Root Overrides 中配置映射规则(例如:将 Windows 下的 Root 2 映射为 macOS 下的 Root 8)。若未配置 Override,Steam 在不支持该 Root 的平台上可能会忽略这些文件或尝试使用默认回退路径。
| 变量 | 典型值 |
|---|---|
%USERPROFILE% |
C:\Users\{Username} |
%USERPROFILE%\My Documents |
C:\Users\{Username}\Documents |
%APPDATA% |
C:\Users\{Username}\AppData\Roaming |
%LOCALAPPDATA% |
C:\Users\{Username}\AppData\Local |
| 变量 | 默认值 |
|---|---|
$XDG_CONFIG_HOME |
~/.config |
$XDG_DATA_HOME |
~/.local/share |
SteamCloudDocuments 是 Auto-Cloud 专用的 Root 类型,用于将存档存放在用户文档目录。实际路径取决于平台:
| 平台 | SteamCloudDocuments (Root 11) 实际路径 |
|---|---|
| macOS | ~/Documents/Steam Cloud/[Steam用户名]/[游戏名]/ |
| Linux | ~/.SteamCloud/[Steam用户名]/[游戏名]/ |
| Windows | %USERPROFILE%\Documents\Steam Cloud\[Steam用户名]\[游戏名]\ |
已验证:macOS 和 Windows 的
cloud_log.txt均证实 Root 11 使用上述平台相关路径。
- 连接游戏
- 查看日志:
[文件名] | VDF root=X | appinfo.vdf root=YYY - 确认:数字 X 对应字符串 YYY
-
查看 remotecache.vdf:
cat ~/Library/Application\ Support/Steam/userdata/*/12345/remotecache.vdf
找到
"root" "X" -
查看 appinfo.vdf ufs 配置: 使用本工具连接游戏,自动解析显示 找到
"root" "YYY" -
确认映射:X ↔ YYY
"{AppID}"
{
"{文件相对路径}"
{
"root" "{0-12}"
"size" "{字节}"
"localtime" "{时间戳}"
"sha" "{SHA-1}"
"syncstate" "{0-2}"
}
}完整的 ufs 节结构:
"ufs"
{
"quota" "配额字节数"
"maxnumfiles" "最大文件数"
"hidecloudui" "0或1" // 可选,Steamworks 后台可见
"sync_while_suspended" "0或1" // 可选,Steamworks 后台可见
"ignoreexternalfiles" "0或1" // 可选,Steamworks 后台可见
"savefiles"
{
"0"
{
"root" "根目录名称" // 如 WinAppDataLocal, MacAppSupport
"path" "子目录路径" // 如 MyGame/Saves/
"pattern" "文件匹配模式" // 如 *.sav, *
"recursive" "1" // 可选,"1" 表示递归扫描子目录
"platforms" // 可选
{
"1" "平台名称" // Windows, MacOS, Linux
}
}
}
"rootoverrides" // 可选,根先决替代
//
// 官方文档说明:
// 如果应用程序是跨平台的,且每个操作系统需要不同的目录,可使用根先决替代。
// 若使用此功能,原始根路径的"操作系统"下拉菜单中应指明 [所有操作系统]。
//
// 由 5 个部分组成:
// 1. 原始根 (root) - 对应上面设置的根之一
// 2. 操作系统 (os) - 使用此先决替代的操作系统
// 3. 新根 (useinstead) - 原始根映射到指定操作系统的新位置
// 4. 添加/替代路径 (addpath) - 插入到新根和原始子目录之间的子目录路径
// 5. 替代路径 - 启用后,addpath 完全替换为 pathtransforms
{
"0" // 索引:独立于 savefiles,从 0 开始(可能不连续)
{
"root" "原始根目录" // 如 gameinstall, WinSavedGames
"os" "目标平台" // Windows, MacOS, Linux (大小写敏感)
"oscompare" "=" // 比较符,目前观察到的值均为 "="
"useinstead" "新根目录" // 新的根目录名称,如 MacAppSupport, LinuxXdgDataHome
"addpath" "附加路径" // 可选,附加到路径末尾 (与 pathtransforms 互斥)
"pathtransforms" // 可选,路径转换 (与 addpath 互斥)
{
"0"
{
"find" "" // 匹配模式,空字符串表示匹配所有
"replace" "SaveData" // 替换内容
}
}
}
}
}| Steamworks 后台 | VDF 字段 | 说明 |
|---|---|---|
| Original Root | root |
要覆盖的原始根目录 |
| OS | os |
目标操作系统 (Windows, MacOS, Linux,大小写敏感) |
| (隐藏) | oscompare |
比较符,UI 不可编辑,目前观察到的值均为 "=" |
| New Root | useinstead |
新的根目录名称 (字符串类型) |
| Add/Replace Path | addpath |
附加路径,未勾选 "Replace Path" 时使用 |
| Replace Path [✓] | pathtransforms |
勾选后使用 pathtransforms 结构替代 addpath |
当 Steamworks UI 中勾选 "Replace Path" 时,后端使用 pathtransforms 结构而非 addpath 字段,二者互斥:
- 未勾选:只有
addpath字段,无pathtransforms - 已勾选:只有
pathtransforms结构,无addpath
pathtransforms 是一个包含索引子节 ("0", "1", ...) 的结构,每个子节包含:
find: 要查找替换的原始路径(通常是 savefile 的 path 值)replace: 替换后的新路径
重要说明:根据对 Steam appinfo.vdf 的实际分析,pathtransforms 的 find 字段应包含原始 savefile 的 path 值(要被替换的路径),replace 字段是新的路径。当 find 为空字符串时,replace 值会被插入到路径开头而非完全替换。
已验证:
- 目前观察到的所有 rootoverride 条目中,
oscompare值均为"=" - Steamworks UI 中该字段不可编辑
推测:
- 该字段以比较操作符的形式存在,暗示可能支持其他值(如
"!="表示"不等于") - 可能是 Valve 预留的扩展字段,用于未来支持更复杂的平台匹配逻辑
- 可能存在通过直接编辑配置使用其他操作符的内部用法
- 使用场景推测:
"!="可用于表示"除了某平台以外的所有平台"
以下字段在 Steamworks 后台 UI 中可见,但在已分析的 appinfo.vdf 中均未观察到:
| 字段 | 已验证 | 推测用途 |
|---|---|---|
hidecloudui |
Steamworks 后台可见,appinfo 中未观察到 | 控制 Steam 客户端是否显示云存储相关 UI(同步状态、冲突解决对话框等) |
sync_while_suspended |
Steamworks 后台可见,appinfo 中未观察到 | 控制游戏挂起时是否继续同步云存档(可能用于 Steam Deck 休眠场景) |
ignoreexternalfiles |
Steamworks 后台可见,appinfo 中未观察到 | 控制是否忽略外部文件(非 Steam 创建的文件),可能用于防止第三方工具干扰云存档 |
推测:
- 这些字段可能是服务端配置,不需要下发到客户端的 appinfo.vdf
- 或者默认值均为 0/false,VDF 序列化时省略默认值
- 需要进一步验证:在 Steamworks 后台启用这些选项后,观察 appinfo.vdf 是否会出现对应字段
cargo run -- --ufs <app_id>
