为了方便访问图书馆,我制作了一个球拍XDG基本目录。由于我希望这个库也可以在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用户会觉得奇怪和不同意吗?
发布于 2018-04-11 20:04:56
我已经在库中为JVM和生锈实现了这样的功能。以下是我学到的:
处理应用程序名称,因为您的用户不能也不会。
提供计算完整路径的API(包括应用程序名称!)配置、缓存等目录。如果不这样做,将导致至少在3种主要平台中的2种平台上出错的代码,因为这些约定有很大的不同。
考虑一下由MegaCorp公司编写的名为Foo的应用程序(web MegaCorp.co.uk)。在Linux下,命名应用程序的路径段应该是fooapp/ (小写,没有空格),在MegaCorp\Foo App\上应该是MegaCorp\Foo App\(注意这两个文件夹),在macOS上应该是uk.co.MegaCorp.Foo-App (用-替换的无效字符)。
对每个目录都有一个清晰的目的的定义。
例如,我的库不提供macOS或Windows上的macOS,因为XDG_RUNTIME_DIR与Windows上的%TEMP%非常不同。
这是一个潜在的安全问题来源,因为Linux上的运行时dir保证只有所有者才能访问它,在用户注销时删除它,等等。
另外,我只在Linux和macOS上提供macOS。Windows确实有一个字体目录,但与Linux和macOS不同,它不是用户可写的。
另一方面,我在所有三个平台上都提供dataDir (%APPDATA%)和dataLocalDir (%LOCALAPPDATA%)。在macOS和Linux上,这些目录返回相同的路径--这是一个明确的设计决定,考虑到如果其中一个目录不可用,用户将如何编写代码:用户要么会忘记处理它,要么就回到另一个目录。对于所选择的设计,这只是开箱即用,用户不需要考虑它。
在用户遇到问题之前避免这些问题。
这就是为什么一般缓存、配置等目录路径返回%LOCALAPPDATA%和%APPDATA%,而特定于应用程序的缓存和配置目录路径返回%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“的库专注于Linux,并发布一个更通用的库,比如处理Linux、Windows等的”标准目录库“,以避免混淆。
希望这能帮上忙!
发布于 2021-12-05 22:17:36
请记住,在Windows上有一个自Windows指定的保存名文件夹。
它被称为“%USERPROFILE%\保存游戏”。
FOLDERID_SavedGames https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid?redirectedfrom=MSDN#constants
https://stackoverflow.com/questions/43853548
复制相似问题