首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Windows的XDG Basedir目录

用于Windows的XDG Basedir目录
EN

Stack Overflow用户
提问于 2017-05-08 17:13:58
回答 2查看 6.2K关注 0票数 25

为了方便访问图书馆,我制作了一个球拍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用户会觉得奇怪和不同意吗?

EN

回答 2

Stack Overflow用户

发布于 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,它查询面向用户的标准目录(音频、文档、下载等)的路径.

虽然BaseDirsUserDirs有相当乏味的构造函数(new()),但ProjectDirs提供了这个工厂方法:

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

这种方法确保用户最终获得正确的、符合标准的路径,以访问其应用程序的缓存、配置等目录,而无需知道每个平台的所有复杂之处。

最后一个建议:我会让一个名为"XDG“的库专注于Linux,并发布一个更通用的库,比如处理Linux、Windows等的”标准目录库“,以避免混淆。

希望这能帮上忙!

票数 33
EN

Stack Overflow用户

发布于 2021-12-05 22:17:36

请记住,在Windows上有一个自Windows指定的保存名文件夹。

它被称为“%USERPROFILE%\保存游戏”。

FOLDERID_SavedGames https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid?redirectedfrom=MSDN#constants

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43853548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档