【问题标题】:XDG Basedir directories for Windows适用于 Windows 的 XDG Basedir 目录
【发布时间】:2017-10-06 19:18:23
【问题描述】:

为了方便访问XDG Basedir directories,我制作了一个球拍library。由于我希望该库也可以在 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 中,似乎没有很好的选择将数据和配置目录分开,所以我为它们使用相同的目录。我的直觉是%LOCALAPPDATA% 是可写$XDG_*_HOME 变量的更好选择,并且在$XDG_*_DIRS 列表中具有“漫游”配置要读取并且通常不会被覆盖。但是,具有漫游配置的企业 Windows 用户会觉得这很奇怪并且不同意吗?

【问题讨论】:

标签: linux windows filepath fhs


【解决方案1】:

我已经在 JVMRust 的库中实现了此类功能。这是我学到的:

处理应用程序名称,因为您的用户不能或不会。

提供计算配置、缓存等目录的完整路径(包括应用程序名称!)的 API。不这样做将导致代码在 3 个主要平台中的至少 2 个平台上保证是错误的,因为约定差异很大。

考虑一个名为 Foo App 的公司 MegaCorp(网址 MegaCorp.co.uk)编写的应用程序。 在 Linux 下,命名应用程序的路径段应为 fooapp/(小写,无空格),在 Windows 上应为 MegaCorp\Foo App\(注意 两个 文件夹),在 macOS 上应为为uk.co.MegaCorp.Foo-App(无效字符替换为-)。

每个目录都有明确的definition of the purpose

例如,我的库在 macOS 或 Windows 上不提供 runtimeDir,因为 XDG_RUNTIME_DIR 与 e 非常不同。 G。 %TEMP% 在 Windows 上。

这是一个潜在的安全问题来源,因为 Linux 上的运行时目录保证它只能由所有者访问,在用户注销时被删除,等等。

另外,我只在 Linux 和 macOS 上提供 fontDir。 Windows 确实有一个字体目录,但与 Linux 和 macOS 不同,它不是用户可写的。

另一方面,我在所有三个平台上同时提供 dataDir (%APPDATA%) 和 dataLocalDir (%LOCALAPPDATA%)。在 macOS 和 Linux 上,这些目录返回相同的路径——这是一个明确的设计决策,考虑到如果其中一个目录不可用,用户将如何编写代码:用户要么忘记处理它,要么只是退回到另一个目录。使用所选择的设计,这只是开箱即用,用户无需考虑。

在用户遇到问题之前避免问题。

这就是为什么general cache, config etc. directory paths返回%LOCALAPPDATA%%APPDATA%,但application-specific cache and config directory paths返回%LOCALAPPDATA%\Company\Application\cache%APPDATA%\Company\Application\config

注意子目录!这是为了保证应用程序的缓存、配置和数据目录的清晰分离,无论用户可能有什么奇怪的 Windows 设置。

将用例拆分为单独的模块。

我的库中有三个不同的模块,具有明确定义的独立用例:

BaseDirs,查询用户不可见的标准目录(缓存、配置、数据、可执行文件、运行时目录)的路径,强烈建议改用ProjectDirs

ProjectDirs,为您自己的应用程序或项目计算缓存、配置或数据目录的位置,这些目录派生自标准目录。

UserDirs,查询面向用户的标准目录(音频、文档、下载等)的路径。

虽然BaseDirsUserDirs 有相当无趣的构造函数(new()),但ProjectDirs 提供了这个工厂方法:

ProjectDirs::from(qualifier: &str, organization: &str, application: &str)

此方法可确保用户最终获得指向其应用程序缓存、配置等目录的正确、符合标准的路径,而无需了解每个单独平台的所有复杂性。


最后一个建议:我会保留一个名为“XDG Basedir Library”的库,专注于 Linux,并发布一个更通用名称的库,如处理 Linux、Windows 等的“标准目录库”以避免混淆.

希望这对您有所帮助!

【讨论】:

    【解决方案2】:

    请记住,在 Windows 上,自 Windows Vista 以来指定了一个存档游戏文件夹。

    它叫做“%USERPROFILE%\Saved Games”。

    FOLDERID_SavedGames https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid?redirectedfrom=MSDN#constants

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多