Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于Windows的XDG Basedir目录_Linux_Windows_Filepath_Fhs - Fatal编程技术网

Linux 用于Windows的XDG Basedir目录

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

我做了一个球拍,以方便进入球场。由于我希望该库也能在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
    =
    %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等的“标准目录库”,以避免混淆


希望这是有帮助的

根据你在过去几年里是如何做到这一点的,我认为你所做的是正确的。