2012-11-26 35 views
1

由于这个应用程序已经发展多年,还有一些INI文件。我有一个使用GetPrivateProfileString读取条目的类。GetPrivateProfileString without Trim?

当时我们看到这个类的顶部:

[DllImport("kernel32")] 
    private static extern int GetPrivateProfileString(string section, 
     string key, string def, StringBuilder retVal, 
     int size, string filePath); 

它看起来像有一个看起来像这样的公共方法:

public string IniReadValue(string Section, string Key) 
    { 
     // If string greater than 254 characters (255th spot is null-terminator), 
     // string will be truncated. 
     const int capacity = 255; 
     StringBuilder temp = new StringBuilder(capacity); 
     int i = GetPrivateProfileString(Section, Key, "", temp, 
             capacity, this.m_Path); 
     return temp.ToString(); 
    } 

我最近注意到,GetPrivateProfileString修剪它的数据。因此,如果我的INI文件有这样的条目:

SomeData =注意这句话前后三个尾随空格。

它将检索它像(请注意,它修剪到左,右 - 忽略引号):

“注意在前面,这句话的后面3个连续的空间。”

我不希望它修剪。这是不是我的控制? INI文件在等号后不允许有空格(例如SomeData =)?

+1

你可以随时制作自己的解析器 –

+0

@Sam我。是的我同意。我也很好奇这个特殊的功能,以及为什么它需要修剪字符串。尽管感谢您的意见,但我已经对您的意见投了赞成票。 – JustLooking

+3

当需要前导或尾随空格时,在ini文件中使用双引号。 –

回答

1

正如评论中指出的那样,API就是这样工作的。如果你可以忍受的,你至少可以通过例如使用这个库/包装节省一些的DllImport工作(包括源,只有一个文件):

IniReader

+0

我想的很多。我希望我忽略了一些告诫它不要修剪的参数,或者一些没有修剪的新功能。它对我来说没有意义,为什么它会修剪字符串。为什么不把它归还给我,如果我愿意,让我修剪一下?或者,如果GetPrivateProfileString返回字符串Trimmed,为什么WritePrivateProfileString不写入Trimmed?他们携手并进,为什么不表现出类似的表现呢?总之,我不喜欢它! :) ...无论如何,感谢您的意见,我会给你一个绿色的复选标记。再次感谢。 – JustLooking

+0

那么,我希望你找到一个处理它的好方法,祝你好运! –

+0

我做到了。谢谢。我写了我自己的小解析器(相当简单)..循环直到找到我的Section,如果我的Key在那里,返回值(否则返回一个默认值)。 – JustLooking

1

您可以使用引号来表达你的内容,当将内容读入字符串时,您可以轻松地解析您想要的内容。 是这样的: key =“content”

你可以在函数IniReadValue中添加一些代码。

或者你可以把/获取信息使用的base64字符串,像这样: 一些键=您的内容 - 在 - 基于64位字符串 和许多字符的问题不会是你的问题。 但这种方式不适合阅读。

+0

记住,由于遗留代码,我使用INI文件。因此,如果我添加引号,遗留代码(无需编码更改)将不知道解析引号。我刚写完自己的函数:IniReadValueNoTrim。感谢您的参与,我为您提供了帮助的答案。再次感谢。 – JustLooking