我正在用 Ruby 开发一个 CLI 应用程序,我想允许通过 /etc/appnamerc
的标准配置文件级联在 Unix 中进行配置。 , ~/.appnamerc
.但是,该应用程序也意味着在 Windows 环境中运行,我不确定将 /etc/appnamerc
之类的文件放在哪里( C:\windows\system32\etc\drivers
似乎不是正确的位置)。此外,我决定查找系统配置文件的任何方案还需要考虑不同版本的 Windows,即 C:\Users
与 C:\Documents and Settings
.至于特定于用户的配置,我也不确定我的应用程序在哪里寻找特定于用户的配置文件,以及类似的东西的标准命名约定是什么。
最佳答案
您正在寻找的是 SHGetKnownFolderPath function (或者——在旧版本的 Windows 上——SHGetFolderPath function)。
虽然 Windows 对这些路径是什么以及它们所在的位置有约定,但这完全取决于版本、配置和其他因素,因此硬编码文件夹名称是一个坏的主意。不过,上述功能从一开始就是获取那些“特殊”文件夹位置的方法。
这些函数的主要参数是 KNOWNFOLDERID或 CSIDL其中指定您要获取的文件夹。
实际上,您有两个不同的“标志”:Windows 上用户特定的和机器特定的。位置可以特定于单个用户或对所有用户可用,也可以特定于单个机器或在用户有权访问的所有机器上可用。下面分别区分。
您确实想要的是以下内容:
FOLDERID_ProgramData
/CSIDL_COMMON_APPDATA
:这是针对所有用户的程序设置,因此大约相当于/etc/foorc
。您应该在那里为您的程序创建一个目录,并将您的所有用户配置存储在那里。请注意,对于普通用户来说,这个目录不可可写(就像/etc
一样,我认为)。不过,此目录是特定于机器的。FOLDERID_RoamingAppData
/CSIDL_APPDATA
:这用于特定于用户的设置或应用程序数据。对于大多数用例,这应该是您放置它的主要位置,因为它将保存在漫游配置文件中——因此它可以在用户登录的每台计算机上访问。所以这相当于您的~/.foorc
。适用于所有用户变体的相同规则。FOLDERID_LocalAppData
/CSIDL_LOCAL_APPDATA
:这是用户特定数据的机器特定位置。通常这应该用于诸如缓存之类的东西,这些东西很好用,但不必在用户每次登录时都通过网络进行复制。请注意,Thunderbird 在将 IMAP 邮件的本地副本存储在漫游配置文件中时犯了这个错误——当您在其中有几 GiB 的数据时,这会很有趣。
一般来说,请避免将您的 .foorc
粘贴到用户的个人资料文件夹中。 Windows 不是 UNIX,以点开头的文件不会自动隐藏(有一个文件系统标志)。对我来说,如果应用程序这样做只是一件烦人的事,因为用户的配置文件目录不是 Windows 上那种东西的地方。 Likewise, the Documents folder is not a good place for applications to create stuff without the user's consent or explicit action.
在 Ruby 中,您应该能够使用 Win32API 库调用这些函数。 This看起来有点前途(虽然很丑);但是,我所知道的还不足以实际向您展示一个有效的示例。
最后的选择是使用环境变量。环境变量 ALLUSERSPROFILE
、APPDATA
和 LOCALAPPDATA
分别等同于上述 FolderID。
关于系统配置目录的 Windows 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359338/