XDG Basedir directories for Windows



为了方便访问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 AppMegaCorp公司(网址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,用于查询面向用户的标准目录(音频、文档、下载等)的路径。

虽然BaseDirsUserDirs有相当不有趣的构造函数(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

相关内容

  • 没有找到相关文章