系统配置目录的 Windows 等价物

标签 windows ruby configuration command-line configuration-files

我正在用 Ruby 开发一个 CLI 应用程序,我想允许通过 /etc/appnamerc 的标准配置文件级联在 Unix 中进行配置。 , ~/.appnamerc .但是,该应用程序也意味着在 Windows 环境中运行,我不确定将 /etc/appnamerc 之类的文件放在哪里( C:\windows\system32\etc\drivers 似乎不是正确的位置)。此外,我决定查找系统配置文件的任何方案还需要考虑不同版本的 Windows,即 C:\UsersC:\Documents and Settings .至于特定于用户的配置,我也不确定我的应用程序在哪里寻找特定于用户的配置文件,以及类似的东西的标准命名约定是什么。

最佳答案

您正在寻找的是 SHGetKnownFolderPath function (或者——在旧版本的 Windows 上——SHGetFolderPath function)。

虽然 Windows 对这些路径是什么以及它们所在的位置有约定,但这完全取决于版本、配置和其他因素,因此硬编码文件夹名称是一个的主意。不过,上述功能从一开始就是获取那些“特殊”文件夹位置的方法。

这些函数的主要参数是 KNOWNFOLDERIDCSIDL其中指定您要获取的文件夹。

实际上,您有两个不同的“标志”: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看起来有点前途(虽然很丑);但是,我所知道的还不足以实际向您展示一个有效的示例。

最后的选择是使用环境变量。环境变量 ALLUSERSPROFILEAPPDATALOCALAPPDATA 分别等同于上述 FolderID。

关于系统配置目录的 Windows 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359338/

相关文章:

vim - 奇怪的行为 : Vim starts in command line mode

C# Windows 10 通用应用程序 - MVVM 刷新

windows - windows和linux在网络编程上有多少不同?

windows - 如何以编程方式从 Windows 桌面移动图标的位置?

ruby-on-rails - 搜索表单不起作用,并在 Rails 应用程序中出错

ruby - 哪个 ruby​​ 版本/构建最适合 rails 3?

ruby - ruby 中的 $~ 是什么

java - 在 Java 中配置过滤器

c++ - 应该如何从回调函数更新/返回值?

ruby-on-rails - 如何在Rails启动时创建线程?