linux - 适用于 Windows 的 XDG Basedir 目录

标签 linux windows filepath fhs

我做了一个 Racket library为了方便访问 XDG Basedir directories .因为我希望该库也可在 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 用户会觉得奇怪和不同意吗?

最佳答案

我已经在 JVM 的库中实现了这样的功能和 Rust .这是我学到的:

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

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

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

清楚definition of the purpose每个目录。

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

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

此外,我只提供fontDir在 Linux 和 macOS 上。 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 等的“Standard Directory Library”,以避免混淆.

希望这对您有所帮助!

关于linux - 适用于 Windows 的 XDG Basedir 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853548/

相关文章:

c++ - 大型递归字符串操作的段错误

Ruby OpenSSL 错误 - 缺少 CA 证书(Justin 是谁?)

c - 如何在windows中检查WriteFile之前是否有足够的空间?

c - fopen() 中的绝对路径

我可以在主应用程序和多个线程中使用相同的套接字吗?

python - 导入错误 : No module named _smbus_cffi

linux - shell 脚本中的超时并报告那些超时的输入

windows - 如何连接代理 : IPC connect call

macos - isDirectory 参数是否为 +[NSURL fileURLWithPath :isDirectory:] need to be correct?

python - 在python中将文件路径存储为变量