Linux 用于Windows的XDG Basedir目录
我做了一个球拍,以方便进入球场。由于我希望该库也能在Windows上使用(对于跨平台程序),因此当XDG环境变量未设置时,我让它使用标准Windows目录作为默认目录 我目前正在使用以下工具:Linux 用于Windows的XDG Basedir目录,linux,windows,filepath,fhs,Linux,Windows,Filepath,Fhs,我做了一个球拍,以方便进入球场。由于我希望该库也能在Windows上使用(对于跨平台程序),因此当XDG环境变量未设置时,我让它使用标准Windows目录作为默认目录 我目前正在使用以下工具: $XDG\u DATA\u HOME=%LOCALAPPDATA% $XDG\u DATA\u DIRS=%APPDATA% $XDG\u CONFIG\u HOME=%LOCALAPPDATA% $XDG\u CONFIG\u DIRS=%APPDATA% $XDG\u CACHE\u HOME=%T
=$XDG\u DATA\u HOME
%LOCALAPPDATA%
=$XDG\u DATA\u DIRS
%APPDATA%
=$XDG\u CONFIG\u HOME
%LOCALAPPDATA%
=$XDG\u CONFIG\u DIRS
%APPDATA%
=$XDG\u CACHE\u HOME
%TEMP%
=$XDG\u RUNTIME\u DIR
%TEMP%
我的问题是是否有比这些更好的违约。我知道
%TEMP%
作为$XDG\u RUNTIME\u DIR
是错误的,因为它确实应该位于类似/tmp
的ramfs上,但我不知道Windows上有任何这样的目录。在Windows中,似乎没有将数据和配置目录分开的好选项,因此我对它们使用相同的目录。我的直觉是,%LOCALAPPDATA%
对于可写的$XDG\u*\ u HOME
变量来说是一个更好的选择,并且在$XDG\u*\ u DIRS
列表中具有“漫游”配置以供读取,通常不会被覆盖。但是,具有漫游配置的公司Windows用户是否会感到奇怪和不同意呢?我已经在和的库中实现了这样的功能。以下是我学到的:
处理应用程序名称,因为您的用户不能或不会。
提供计算到配置、缓存等目录的完整路径(包括应用程序名!)的API。不这样做将导致代码在3个主要平台中的至少2个平台上肯定是错误的,因为约定差异很大
考虑由MegaCorp公司(网址MegaCorp.co.uk)编写的名为FooApp的应用程序。
在Linux下,命名应用程序的路径段应该是fooapp/
(小写,无空格),在Windows上应该是MegaCorp\Foo-App\
(注意这两个文件夹),在macOS上应该是uk.co.MegaCorp.Foo-App
(无效字符替换为-
)
清除每个目录。
例如,我的库在macOS或Windows上不提供runtimeDir
,因为XDG\u RUNTIME\u DIR
与e。g<在Windows上,代码>%TEMP%
这是一个潜在的安全问题源,因为Linux上的runtime dir保证它只能被所有者访问,在用户注销时被删除,等等
此外,我只在Linux和macOS上提供fontDir
。Windows确实有一个字体目录,但与Linux和macOS不同,它不是用户可写的
另一方面,我在所有三个平台上提供了dataDir
(%APPDATA%
)和dataLocalDir
(%LOCALAPPDATA%
)。在macOS和Linux上,这些目录返回相同的路径——这是一个明确的设计决策,考虑到如果其中一个目录不可用,用户将如何编写代码:用户要么忘记处理它,要么干脆退回到另一个目录。对于所选择的设计,这只是开箱即用,用户无需考虑
在用户遇到问题之前避免问题。
这就是为什么返回%LOCALAPPDATA%
和%APPDATA%
,但返回%LOCALAPPDATA%\Company\Application\cache
和%APPDATA%\Company\Application\config
注意子目录!这是为了保证应用程序的缓存、配置和数据目录的干净分离,而不管用户可能有什么奇怪的Windows设置
将用例拆分为单独的模块。
我的库中有三个不同的模块,具有明确定义的独立用例:
,它查询用户不可见的标准目录(缓存、配置、数据、可执行文件、运行时目录)的路径,并强烈建议改用ProjectDir
,它为您自己的应用程序或项目计算从标准目录派生的缓存、配置或数据目录的位置
,它查询面向用户的标准目录(音频、文档、下载等)的路径
虽然BaseDirs
和UserDirs
具有相当无趣的构造函数(new()
),但ProjectDirs
提供了以下工厂方法:
ProjectDirs::from(限定符:&str,组织:&str,应用程序:&str)
这种方法可以确保用户最终拥有正确的、符合标准的路径,可以访问其应用程序的缓存、配置等目录,而无需了解每个平台的所有复杂性
最后一个建议是:我将保留一个名为“XDG Basedir library”的库,重点放在Linux上,并发布一个更通用的库,如处理Linux、Windows等的“标准目录库”,以避免混淆
希望这是有帮助的 根据你在过去几年里是如何做到这一点的,我认为你所做的是正确的。