为了方便访问XDG Basedir目录,我制作了一个球拍库。 由于我希望该库也可以在 Windows 上使用(用于跨平台程序),因此当未设置 XDG 环境变量时,我让它使用标准 Windows 目录作为默认值。
我目前正在使用以下设备:
$XDG_DATA_HOME
=%LOCALAPPDATA%
$XDG_DATA_DIRS
=%APPDATA%
$XDG_CONFIG_HOME
=%LOCALAPPDATA%
$XDG_CONFIG_DIRS
=%APPDATA%
$XDG_CACHE_HOME
=%TEMP%
$XDG_RUNTIME_DIR
=%TEMP%
我的问题是是否有比这些更好的默认值。 我知道%TEMP%
因为$XDG_RUNTIME_DIR
是错误的,因为它确实应该在像/tmp
这样的 ramfs 上,但我不知道 Windows 上有任何目录是这样的。 在 Windows 中,似乎没有将数据和配置目录分开的好选择,所以我对它们使用相同的目录。 我的直觉是,对于可写$XDG_*_HOME
变量和$XDG_*_DIRS
列表中要读取且通常不会覆盖的"漫游"配置,%LOCALAPPDATA%
是更好的选择。 但是,具有漫游配置的企业Windows用户会觉得奇怪并不同意吗?
我已经在JVM和Rust的库中实现了这样的功能。以下是我学到的:
处理应用程序名称,因为您的用户不能或不会。
提供计算配置、缓存等目录的完整路径(包括应用程序名称!)的 API。如果不这样做,将导致代码在 3 个主要平台中的至少 2 个平台上保证是错误的,因为约定差异很大。
考虑由名为Foo App的MegaCorp公司(网址MegaCorp.co.uk)编写的应用程序。 在 Linux 下,命名应用程序的路径段应该是fooapp/
(小写,没有空格),在 Windows 上应该是MegaCorpFoo App
(注意两个文件夹),在 macOS 上应该是uk.co.MegaCorp.Foo-App
(无效字符替换为-
)。
明确定义每个目录的用途。
例如,我的库在macOS或Windows上不提供runtimeDir
,因为XDG_RUNTIME_DIR
与例如非常不同。%TEMP%
在Windows上。
这是安全问题的潜在来源,因为 Linux 上的运行时目录保证它只能由所有者访问,在用户注销时被删除等。
另外,我只在Linux和macOS上提供fontDir
。Windows确实有一个字体目录,但与Linux和macOS不同,它不是用户可写的。
另一方面,我在所有三个平台上提供dataDir
(%APPDATA%
)和dataLocalDir
(%LOCALAPPDATA%
)。在macOS和Linux上,这些目录返回相同的路径 - 这是一个明确的设计决策,考虑到如果其中一个目录不可用,用户将如何编写代码:用户要么忘记处理它,要么只是回退到另一个目录。使用所选的设计,这开箱即用,用户无需考虑。
在用户遇到问题之前避免问题。
这就是为什么一般缓存、配置等目录路径返回%LOCALAPPDATA%
和%APPDATA%
,但特定于应用程序的缓存和配置目录路径返回%LOCALAPPDATA%CompanyApplicationcache
和%APPDATA%CompanyApplicationconfig
。
请注意子目录!这是为了保证应用程序的缓存、配置和数据目录的干净分离,无论用户可能有什么奇怪的 Windows 设置。
将用例拆分为单独的模块。
我的库中有三个不同的模块,具有明确定义的独立用例:
BaseDirs,它查询用户不可见的标准目录(缓存、配置、数据、可执行文件、运行时目录)的路径,并强烈建议改用ProjectDirs。
ProjectDirs,用于计算您自己的应用程序或项目的缓存、配置或数据目录的位置,这些目录派生自标准目录。
UserDirs,用于查询面向用户的标准目录(音频、文档、下载等)的路径。
虽然BaseDirs
和UserDirs
有相当不有趣的构造函数(new()
),ProjectDirs
提供了这样的工厂方法:
ProjectDirs::from(qualifier: &str, organization: &str, application: &str)
这种方法可确保用户最终获得正确的、符合标准的路径,以访问其应用程序的缓存、配置等目录,而无需了解每个平台的所有复杂性。
最后一个建议:我会保留一个名为"XDG Basedir Library"的库,专注于Linux,并发布一个名称更通用的库,如"标准目录库",处理Linux,Windows等,以避免混淆。
希望这是有帮助的!
请记住,在Windows上,自Windows Vista以来指定了一个保存游戏文件夹。
它被称为"%USERPROFILE%\Save Games"。
FOLDERID_SavedGames https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid?redirectedfrom=MSDN#constants