我正在 Ruby 中开发一个 CLI 应用程序,我希望允许通过标准配置文件级联在 Unix 中进行配置/etc/appnamerc
, ~/.appnamerc
。然而,该应用程序也应该在 Windows 环境中运行,我不确定将像这样的文件放在哪里/etc/appnamerc
(C:\windows\system32\etc\drivers
看起来这不是正确的地方)。此外,无论我决定采用什么方案来查找系统配置文件,也需要考虑不同版本的 Windows,即C:\Users
vs. C:\Documents and Settings
。就特定于用户的配置而言,我也不确定让我的应用程序在哪里查找特定于用户的配置文件,以及类似内容的标准命名约定是什么。
您正在寻找的是SHGetKnownFolderPath 函数 http://msdn.microsoft.com/en-us/library/bb762188(VS.85).aspx(或者,在旧版本的 Windows 上,SHGetFolderPath 函数 http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx).
虽然 Windows 对这些路径是什么以及它们驻留的位置有约定,但这完全取决于版本、配置和其他因素,因此硬编码文件夹名称是bad主意。不过,上述函数从一开始就是获取这些“特殊”文件夹位置的方法。
这些函数的主要参数是已知文件夹ID http://msdn.microsoft.com/en-us/library/bb762584(VS.85).aspx or a CSIDL http://msdn.microsoft.com/en-us/library/bb762494(VS.85).aspx其中指定您要获取哪个文件夹。
实际上,您有两个不同的“标志”:Windows 上的用户特定和机器特定。位置可以特定于单个用户或可供所有用户使用,也可以特定于单个计算机或可用于用户有权访问的所有计算机。下面将对其进行区分。
您想要的内容如下:
-
FOLDERID_ProgramData
/CSIDL_COMMON_APPDATA
:这是针对所有用户的程序设置,因此大约相当于/etc/foorc
。您应该在那里为您的程序创建一个目录并在那里存储您的所有用户配置。注意这个目录是not普通用户可写(就像/etc
我想也是如此)。不过,该目录是特定于机器的。
-
FOLDERID_RoamingAppData
/CSIDL_APPDATA
:这用于用户特定的设置或应用程序数据。对于大多数用例,这应该是您放置此内容的主要位置,因为它将保存在漫游配置文件中,因此可以在用户登录的每台计算机上访问它。所以这相当于你的~/.foorc
。适用与所有用户变体相同的规则。
-
FOLDERID_LocalAppData
/CSIDL_LOCAL_APPDATA
:这是用户特定数据的机器特定位置。通常这应该用于诸如缓存之类的东西,这些东西很好用,但不需要每次用户登录时都通过网络进行复制。请注意,Thunderbird 在将 IMAP 邮件的本地副本存储在漫游配置文件中时犯了一个非常错误的错误 - 当您有几 GiB 的数据时,这有点有趣。
一般来说,请避免仅仅粘贴您的.foorc
在用户的配置文件文件夹中。 Windows 不是 UNIX,前面带有点的文件不会自动隐藏(有一个文件系统标志)。对我来说,如果应用程序这样做只是一种烦恼,因为用户的配置文件目录不是 Windows 上进行此类操作的地方。同样,在未经用户同意或明确操作的情况下,“文档”文件夹也不是应用程序创建内容的好地方。 http://blogs.msdn.com/oldnewthing/archive/2006/12/28/1374334.aspx
在 Ruby 中,您应该能够使用 Win32API 库调用这些函数。This http://phrogz.net/ProgrammingRuby/lib_windows.html#Win32API看起来似乎很有希望(虽然丑陋);但是,我还不够了解,无法实际向您展示一个可行的示例。
最后的选择是使用环境变量。环境变量ALLUSERSPROFILE
, APPDATA
and LOCALAPPDATA
是上述文件夹 ID 的相应等效项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)