一个读取ini文件问题,无法读取,怎么回事

时间:2021-10-10 19:25:39
代码很简单,我要读取遨游目录下ini文件
procedure TForm1.Button1Click(Sender: TObject);
var
  FIniFile: TIniFile;
begin

  FIniFile := TIniFile.Create('C:\Program Files\Maxthon2\SharedAccount\Config\Plugins.ini');
  try
   if FiniFile.SectionExists('Settings') then begin
     showmessage('SectionExists');
     if FiniFile.ValueExists('Settings','LoadAllIEPlugin') then
       showmessage('ValueExists');
   end;
    FiniFile.WriteString('Settings','LoadAllIEPlugin','1');
  finally
    FreeAndNil(FIniFile);
  end;
'SectionExists'消息框不出来,也就是说根本没读取到Settings这个小结名
FiniFile.WriteString('Settings','LoadAllIEPlugin','1');
这句在ini文件末尾又加了一个[Settings] LoadAllIEPlugin=1,也就是说读取不到后又自动创建了这个小结,第二次点击按钮
'SectionExists'消息框就会弹出提示,说明可以读取到。
另外我如果建一个空白的ini文件,把这个已经存在的ini文件的内容拷贝过来后,也能够第一次就读取到[Settings]的值,这是怎么回事呀。感觉是自己新建的就可以读取到,对已经生成的就无法读取到。

15 个解决方案

#1


注意字符的类型 大小写

#2


都是直接拷贝过来的呀。读取section段的消息'SectionExists'根本不执行。说明根本没读取到

#3


我另外新建一个ini文件,把原来的ini文件内容直接拷贝到新建的ini文件里,可以读取出来。但是就是无法读取原来的ini文件,我复制原来的ini文件,读这个复制的文件也同样读取不到。就是原先建好的无法读取,非要新建一个才能读取

#4


哪位能帮忙在自己的机器上试一下看看呀。不是自己新建的,就是读取遨游目录下的已存在的那个配置文件看是否能读取出来

#5


可能和存放的字符编码有关吧

#6


{配置文件读写}
  if FileExists(AppPath + 'xxx.ini') then
  begin
    MyIni := TIniFile.Create(AppPath + 'xxx.ini');
    EditPort.Text := MyIni.ReadString('set', 'aaa', '');
    EditKey.Text := MyIni.ReadString('set', 'bbb', '');
    MyIni.Destroy;
  end
  else
  begin

    MyIni := TIniFile.Create(AppPath + 'xxx.ini');
    MyIni.WriteString('set', 'aaa', 111);
    MyIni.WriteString('set', 'bbb', 222);
    MyIni.Destroy;
  end;

#7


看了楼主的杰作认为有点搞笑,

首先你查找的项未找到,说明此项在文件中不存在,但你后面加载了一个语句是

FiniFile.WriteString('Settings','LoadAllIEPlugin','1'); 

而后,点击第二次按钮事件就发现会出现对话框,

你以为第一次的INI文件有问题,就又创建了一个空的INI文件,并考备了第一次按钮事件后的INI文件内容,
呵呵
此时的  'Settings','LoadAllIEPlugin','1' 这一项是已经存在的,
试问LZ,
你是写代码急晕了吗?

#8


楼主不要急,把思路理清楚
需要说明的是:
FiniFile.WriteString('Settings','LoadAllIEPlugin','1'); 
这个write动作,如果原来没有settings节,则会自动创建这个节

#9


回复liuhuan992,那个确实应该放在判断里面。这个没错。
但是我把那段writestring的屏蔽了,不写总可以吧。
但是不屏蔽FiniFile.WriteString('Settings','LoadAllIEPlugin','1'); 却又能添加一个新的'Settings'+LoadAllIEPlugin,则还是说明上面的判断没执行,因为如果存在这个的的'Settings'的话,应该是直接更新原来已经存在的LoadAllIEPlugin的键值,而不是又重新添加一个新的一样的Section呀,也就是说根本就是忽略了原来的同样的Section,重新创建一个新的Section

#10


同样的代码我目录改成windows下的一个配置文件('C:\WINDOWS\win.ini'),
但是能修改成功,直接修改了一个,而不是又增加了一个新的Section
procedure TForm1.Button1Click(Sender: TObject);
var
  FIniFile: TIniFile;
begin

  FIniFile := TIniFile.Create('C:\WINDOWS\win.ini');
  try
  if FiniFile.SectionExists('SciCalc') then begin
    showmessage('SectionExists');
    if FiniFile.ValueExists('SciCalc','layout') then
      showmessage('ValueExists');
  end;
    FiniFile.WriteString('SciCalc','layout','1');
  finally
    FreeAndNil(FIniFile);
  end;
end;

现在的问题是,是不是文件有什么问题?还是说ini文件是不是在什么情况需要进行什么特别处理
各位有遨游的能否做个demo测试一下那个文件来修改一下里面的参数看能否成功,就知道我说的
问题了

#11


找到读不出的原因了,但是该如何解决???
我写了下面的代码读取
FileContent   :=   TStringList.Create;
  if   FileExists('C:\Program Files\Maxthon2.5.4\SharedAccount\Config\Plugins.ini')   then
      begin
          FileContent.LoadFromFile('C:\Program Files\Maxthon2\SharedAccount\Config\Plugins.ini');
          showmessage(FileContent.Text);
  //自己写代码操作吧。
      end;

消息框弹出的本来应该是[Paths]才是正确的,但是消息框弹出的确是   楉煆Paths],前面的
 [ 变了“楉煆”乱码难怪读取不到,所以才创建了一个[Paths]。但是我直接打开ini文件看的又是两个[Paths]这种应该如何处理呀?不可能先删除ini文件再重新创建吧。是否需要转码一类的工作

#12


1、是不是文件读写权限问题?
2、是不是文件编码(gb2312、utf-8/16)的问题?

#13


就是一个ini文件呀。我发现这个ini文件通过直接读取文件的方式,文件都是第一行会这样
比如[Paths]
      ....
      ....
我改成
     换行
     [Paths]
       ....
       ....
我把原来的第一行换了一行就可以读出来了。怎么回事,而且我通过直接读取文件的方式也
就是第一行的 [ 符号变成乱码。

#14


各位,怎么转换呀读取ini文件的时候?没人遇过这样的问题吗

#15


我还发现这个文件打开后另存为“编码”默认是utf-8
而我新建的普通文本做成的ini文件打开后另存“编码”默认是Ansi,是不是
编码问题导致读取不了?还需要经过何种转换

#1


注意字符的类型 大小写

#2


都是直接拷贝过来的呀。读取section段的消息'SectionExists'根本不执行。说明根本没读取到

#3


我另外新建一个ini文件,把原来的ini文件内容直接拷贝到新建的ini文件里,可以读取出来。但是就是无法读取原来的ini文件,我复制原来的ini文件,读这个复制的文件也同样读取不到。就是原先建好的无法读取,非要新建一个才能读取

#4


哪位能帮忙在自己的机器上试一下看看呀。不是自己新建的,就是读取遨游目录下的已存在的那个配置文件看是否能读取出来

#5


可能和存放的字符编码有关吧

#6


{配置文件读写}
  if FileExists(AppPath + 'xxx.ini') then
  begin
    MyIni := TIniFile.Create(AppPath + 'xxx.ini');
    EditPort.Text := MyIni.ReadString('set', 'aaa', '');
    EditKey.Text := MyIni.ReadString('set', 'bbb', '');
    MyIni.Destroy;
  end
  else
  begin

    MyIni := TIniFile.Create(AppPath + 'xxx.ini');
    MyIni.WriteString('set', 'aaa', 111);
    MyIni.WriteString('set', 'bbb', 222);
    MyIni.Destroy;
  end;

#7


看了楼主的杰作认为有点搞笑,

首先你查找的项未找到,说明此项在文件中不存在,但你后面加载了一个语句是

FiniFile.WriteString('Settings','LoadAllIEPlugin','1'); 

而后,点击第二次按钮事件就发现会出现对话框,

你以为第一次的INI文件有问题,就又创建了一个空的INI文件,并考备了第一次按钮事件后的INI文件内容,
呵呵
此时的  'Settings','LoadAllIEPlugin','1' 这一项是已经存在的,
试问LZ,
你是写代码急晕了吗?

#8


楼主不要急,把思路理清楚
需要说明的是:
FiniFile.WriteString('Settings','LoadAllIEPlugin','1'); 
这个write动作,如果原来没有settings节,则会自动创建这个节

#9


回复liuhuan992,那个确实应该放在判断里面。这个没错。
但是我把那段writestring的屏蔽了,不写总可以吧。
但是不屏蔽FiniFile.WriteString('Settings','LoadAllIEPlugin','1'); 却又能添加一个新的'Settings'+LoadAllIEPlugin,则还是说明上面的判断没执行,因为如果存在这个的的'Settings'的话,应该是直接更新原来已经存在的LoadAllIEPlugin的键值,而不是又重新添加一个新的一样的Section呀,也就是说根本就是忽略了原来的同样的Section,重新创建一个新的Section

#10


同样的代码我目录改成windows下的一个配置文件('C:\WINDOWS\win.ini'),
但是能修改成功,直接修改了一个,而不是又增加了一个新的Section
procedure TForm1.Button1Click(Sender: TObject);
var
  FIniFile: TIniFile;
begin

  FIniFile := TIniFile.Create('C:\WINDOWS\win.ini');
  try
  if FiniFile.SectionExists('SciCalc') then begin
    showmessage('SectionExists');
    if FiniFile.ValueExists('SciCalc','layout') then
      showmessage('ValueExists');
  end;
    FiniFile.WriteString('SciCalc','layout','1');
  finally
    FreeAndNil(FIniFile);
  end;
end;

现在的问题是,是不是文件有什么问题?还是说ini文件是不是在什么情况需要进行什么特别处理
各位有遨游的能否做个demo测试一下那个文件来修改一下里面的参数看能否成功,就知道我说的
问题了

#11


找到读不出的原因了,但是该如何解决???
我写了下面的代码读取
FileContent   :=   TStringList.Create;
  if   FileExists('C:\Program Files\Maxthon2.5.4\SharedAccount\Config\Plugins.ini')   then
      begin
          FileContent.LoadFromFile('C:\Program Files\Maxthon2\SharedAccount\Config\Plugins.ini');
          showmessage(FileContent.Text);
  //自己写代码操作吧。
      end;

消息框弹出的本来应该是[Paths]才是正确的,但是消息框弹出的确是   楉煆Paths],前面的
 [ 变了“楉煆”乱码难怪读取不到,所以才创建了一个[Paths]。但是我直接打开ini文件看的又是两个[Paths]这种应该如何处理呀?不可能先删除ini文件再重新创建吧。是否需要转码一类的工作

#12


1、是不是文件读写权限问题?
2、是不是文件编码(gb2312、utf-8/16)的问题?

#13


就是一个ini文件呀。我发现这个ini文件通过直接读取文件的方式,文件都是第一行会这样
比如[Paths]
      ....
      ....
我改成
     换行
     [Paths]
       ....
       ....
我把原来的第一行换了一行就可以读出来了。怎么回事,而且我通过直接读取文件的方式也
就是第一行的 [ 符号变成乱码。

#14


各位,怎么转换呀读取ini文件的时候?没人遇过这样的问题吗

#15


我还发现这个文件打开后另存为“编码”默认是utf-8
而我新建的普通文本做成的ini文件打开后另存“编码”默认是Ansi,是不是
编码问题导致读取不了?还需要经过何种转换