适用于Windows的XDG Basedir目录

Wil*_*tch 11 linux windows filepath fhs

为了方便访问XDG Basedir目录,我创建了一个Racket .因为我希望该库在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是错误的,因为它确实应该是像RAMFS /tmp,但我不知道在Windows上的任何目录就是这样的.在Windows中,似乎没有好的选择将数据和配置目录分开,所以我使用相同的目录.我的直觉是,%LOCALAPPDATA%对于可写$XDG_*_HOME变量而言是更好的选择,并且在$XDG_*_DIRS列表中具有"漫游"配置以进行读取并且通常不会被覆盖.但是,具有漫游配置的企业Windows用户是否会发现这种奇怪且不同意的?

soc*_*soc 14

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

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

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

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

对每个目录的目的有一个明确的定义.

例如,我的库不提供runtimeDiron macOS或Wndows,因为XDG_RUNTIME_DIR它与%TEMP%Windows上的非常不同.

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

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

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

在用户遇到问题之前避免出现问题.

这就是为什么一般的高速缓存,配置等目录路径返回%LOCALAPPDATA%%APPDATA%,但专用高速缓存和config目录路径返回%LOCALAPPDATA%\Company\Application\cache%APPDATA%\Company\Application\config.

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

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

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

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

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

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

虽然BaseDirs并且UserDirs具有相当无趣的构造函数(new()),但ProjectDirs提供了这种工厂方法:

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

这种方法可确保用户最终获得正确的,符合标准的路径到他们的应用程序的缓存,配置等目录 - 而无需了解每个平台的所有复杂性.


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

希望这有用!