适用于Windows的XDG Basedir目录

时间:2017-05-08 17:13:58

标签: linux windows filepath fhs

为方便访问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用户会发现这种奇怪且不同意吗?

1 个答案:

答案 0 :(得分:11)

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

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

提供计算完整路径(包括应用程序名称!)的API到配置,缓存等目录。不执行此操作将导致代码在3个主要平台中的至少2个中保证是错误的,因为惯例差别很大。

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

清楚definition of the purpose每个目录。

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

这是安全问题的潜在来源,因为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等,以避免混淆

希望这有用!