对于我创建的应用程序,我正在尝试找到最佳文件夹位置。我按照文档的建议安装了该应用程序,将文件/usr/share/company_name/product_name
保存config.ini
在用户主目录中的隐藏文件夹中,并将用户创建的文档保存在用户主目录中。
该应用程序需要其他资源:
资源数据库(其内容可以通过代码修改,但建议用户不要进行外部访问)
资源数据库必须是公用的,并且可供所有用户访问,因此它不能位于用户主目录中。它也不能位于隐藏目录中,因为程序可以使用浏览器窗口来定位它并更改其位置。
我本来想把它放在一个“众所周知”的文件夹中,比如/var
或/opt
- 但是当我尝试通过代码打开它时出现错误,命令如下
FILE *resource = fopen(path, "r+");
什么是资源的最佳位置,预先安装,非只读,所有用户可访问并可通过代码修改,不隐藏(应该能够浏览它)?
更新:我能够/srv/MyCompany/MyProduct
通过下面答案中提供的链接放置我的资源。
我希望这是一个好位置?
答案1
配置文件的处理在XDG 基础目录规范。
它定义了一组相关的路径环境变量,如XDG_CONFIG_HOME
和XDG_CONFIG_DIRS
,例如,定义.config
目录的默认位置,以及如何以其他各种受控方式处理它。
显然,这种形式非常常见~/.config/product_name
,当它只涉及公司的一种产品时,~/.config/company_name
实际上并没有什么不同。
但假设有多种产品——我认为这种结构
~/.config/company_name/product1
…… 很有意义;~/.config/company_name/product2
我不知道这些或相关标准中是否有描述。但 XDG 标准可能会将其视为普通的产品目录,只不过它将公司的整个软件集视为一个产品。
文件系统层次结构的一般标准用法在Linux 文件系统层次结构。
作为应用程序本身的位置,请查看目录;您可以在etc 或etc/opt
中安装该应用程序,根据标准,这两种方式都是正确的。 /opt/company_name/product1
/opt/product1
您自己发现/srv
目录可能是一个不错的选择。
我同意这是正确的解决方案 - 所以我在这里描述如何将其作为答案:
该目录/srv
类似于/opt
- 标准没有过多说明子目录结构,您可以使用与上述相同的分隔方式。
虽然/opt
明确用于只读应用程序代码,如可执行文件、静态数据文件和文档,但/srv
对数据的可变性没有太多限制;它甚至允许混合具有不同访问权限和可变性的文件。
例如,可以在那里部署可以由系统用户就地更改的文件。
This main purpose of specifying this is so that users may find
the location of the data files for particular service, and so that
services which require a single tree for readonly data, writable data
and scripts (such as cgi scripts) can be reasonably placed. Data that
is only of interest to a specific user should go in that users'
home directory.
The methodology used to name subdirectories of /srv is unspecified as there
is currently no consensus on how this should be done.
要管理需要所有软件用户写入的数据的访问权限,您应该使用分配给包含所有用户的组的权限。
即使“该计算机的所有用户”都属于该组,情况也是如此 - 有许多系统用户不应该能够写入数据;攻击者可能会访问其中一个系统用户帐户。