【问题标题】:Do standard windows .ini files allow comments?标准的 windows .ini 文件是否允许注释?
【发布时间】:2010-11-25 13:55:25
【问题描述】:

Windows ini 文件中是否允许使用 cmets? (...假设您正在使用 GetPrivateProfileString api 函数来读取它们...)

[Section]
Name=Value   ; comment

; full line comment

而且,在任何地方都有适当的 .INI 文件格式规范吗?

感谢您的回复 - 但是也许我还不够清楚。我感兴趣的只是 Windows API 调用读取的格式。我知道其他实现允许 cmets,但我需要了解的具体是 MS Windows 规范和实现。

【问题讨论】:

  • API 返回 Value 和 Comment,您只需要查找分号并阅读,或者遇到时将其去掉,使用正则表达式或只查找 ;
  • @RoguePlanetoid 一个正则表达式,找到一个; 字符?认真的!?
  • @IInspectable 只能使用正则表达式来阅读评论,因此提取分号后的元素,或者正如我在评论中提到的那样,或者寻找 ;提供另一种方法来提取评论本身或寻找一个我认为我的评论增加价值的存在,只是看看是否有分号是不完整的评论

标签: windows comments ini


【解决方案1】:

我在 INI 文件中看到了 cmets,所以是的。请参考this Wikipedia article。我找不到官方规范,但那是 cmets 的正确语法,我记得有很多游戏 INI 文件都有这个。

编辑

API 返回 Value 和 Comment(在我的回复中忘记提及),只需构建和示例 INI 文件并在此(使用 cmets)上调用 API,您可以看到它是如何返回的。

【讨论】:

  • 在使用资源时,使用最权威的资源然后使用任何支持资源更有意义。
  • 当然这是个好主意 - 指出这一点永远不会太迟 - 即使在七年后
【解决方案2】:

是的。看看WikipediaCloanto Implementation of INI File Format(见页面底部)。

【讨论】:

  • 嗯...是什么让您认为这是 INI 文件的权威规范?
  • 虽然 Cloanto 实现可能不是官方规范,但我喜欢他们的解释。
【解决方案3】:

Windows INI API 支持:

  • Line cmets:是的,使用分号;
  • 尾随 cmets:

权威来源是从 INI 文件中读取值的 Windows API 函数

GetPrivateProfileString

从初始化文件的指定节中检索字符串。

"full line cmets" 起作用的原因是因为请求的值不存在。比如解析以下ini文件内容时:

[Application]
UseLiveData=1
;coke=zero
pepsi=diet   ;gag
#stackoverflow=splotchy

读取值:

  • UseLiveData: 1
  • coke不存在
  • ;coke不存在
  • pepsi: diet ;gag
  • stackoverflow不存在
  • #stackoverflow: splotchy

更新:我以前认为数字符号 (#) 是伪行注释字符。使用前导 # 可以隐藏 stackoverflow 的原因是因为名称 stackoverflow 不再存在。事实证明,分号 (;) 是一行注释。

但不支持尾随 cmets。

【讨论】:

  • 非常有用的示例,但我发现 “'full line cmets' 起作用的原因是因为请求的值不存在” 很难解析。我要澄清的是,Windows INI 实现需要在键/值对(如果存在)之前使用分号,否则它被视为值的一部分。
  • @Roddy 你是对的。我太专注于使用 # 以至于我没有注意 ;。修复了指出分号确实是行注释的答案。
【解决方案4】:

在行首使用分号 --->> ;

例如

; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Widgets Inc.

【讨论】:

    【解决方案5】:

    我喜欢@Ian Boydthe analysis,因为它是基于微软官方的GetPrivateProfileString()方法。

    在我尝试编写与 Microsoft 兼容的 INI 解析器时,我发现在上述 Microsoft API 上有一个 closer lookfor comments 我发现:

    • 您可以使用分号来设置行 cmets
    • 分号不必是该行的第一个字符;前面可以有空格、制表符或垂直制表符
    • 即使没有分号,您也可以在节后添加“cmets”。它可能不打算用作注释,但解析器会忽略它。
    • 无法访问部分之外的值(至少我没有找到方法),实际上使它们除了用于评论目的之外毫无用处
    • 当然是滥用,但解析器在 65536 个字符处溢出,因此之后的任何内容都不会成为值的一部分。我不会依赖这个,因为微软可以在更高版本的 Windows 中解决这个问题。此外,当您看不到它时,它作为评论也不是很有用。

    例子:

    this=cannot be accessed
    [section]this=is ignored
    ;this=is a line comment
          ;this=is a comment preceded by spaces
    key=value                                <... 65530 spaces ...>this=cannot be parsed
    

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多