zoukankan      html  css  js  c++  java
  • Delphi中ini文件读取的Value超长问题

    分享给大家,本人踩到的坑,和解决的办法。谢谢!

    本人在使用ini文件做配置时发现,写进去4K个字节,读取到的长度只有2047;

    本例子开发的场景:本人的一个软件需要高度的用户自定义功能,ini文件存取开始还是好好的,突然一个界面的内容较多,

    加载时发现界面没有按用户自定义的展示啊,读取时做了判断,读取到了字符串不符合规则的都认为是空字符串,不可能啊,按规则存进去的怎么可能出错,查看ini文件的某个键值没有任何问题啊,

    然后下断点调试了一下,发现直接从Ini文件中读出来的字符串不完整.......怎么办?

    ----------------解决这个问题的部分测试代码---开始----Delphi 7-----

    test.ini没有上传。

    这部分代码只是测试的时候写的,在此处没有任何问题

    procedure TForm1.Button4Click(Sender: TObject);
    var
    //要Uses Inifiles
    vini:Tinifile;
    //Buffer: array[0..8191] of Char;
    Buffer: Pchar;
    Default,vResult:string;
    vbuffer:array of PChar;
    begin
    //PChar(ExtractFilePath(ParamStr(0))
    vini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'test.ini');
    Default:='A';
    //vini.ReadString()
    //SetLength(vbuffer,8192);
    GetMem(Buffer,2048 * 4);
    FillChar(Buffer^,2048 * 4,#0);
    //Buffer:=PChar(vbuffer);
    SetString(vResult, Buffer, GetPrivateProfileString(PChar(Edit3.Text ), //Edit3.Text 小节
    PChar('FormFilterSet'), PChar(Default), Buffer, 2048 * 4, PChar(TCustomIniFile(vini).filename ))); //'FormFilterSet'键 ,Default是默认值
    memo1.Lines.Add(vResult);
    memo1.Lines.Add('---------------------------');
    //memo1.Lines.Add(FFileName);
    FreeMem(Buffer,2048 * 4);

    end;

    -----------解决这个问题的部分测试代码-----结束----------

    --------项目中实际用到的代码---开始---------Delphi XE--------

    /// <summary>
    /// ini文件的Value很长,不能全部读取,请使用此函数
    /// <param name="Section">小节 String类型</param>
    /// <param name="IniKey">键名 String类型</param>
    /// <param name="DefaultValue">默认值 String类型</param>
    /// <param name="IniFileName">文件名 String类型</param>
    /// <param name="KiloBytes">千字节 Byte类型默认读取8K字节</param>
    /// </summary>
    function IniFileReadStringEx(const Section, IniKey, DefaultValue,IniFileName:string;KiloBytes:Byte=8):string;

    //实现部分

    function IniFileReadStringEx(const Section, IniKey, DefaultValue, IniFileName: string; KiloBytes:Byte=8):string;
    var
    Buffer:PChar;
    //vBuffer:array of Char;
    begin

    //if KiloBytes<8 then
    // KiloBytes:=8;
    Buffer:=StrAlloc(1024*KiloBytes);
    SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
    PChar(IniKey), PChar(DefaultValue), Buffer,1024*KiloBytes, PChar(IniFileName)));
    StrDispose(Buffer);
    { 这个也行

    GetMem(Buffer,1024*KiloBytes);
    FillChar(Buffer^,1024*KiloBytes,#0);
    SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
    PChar(IniKey), PChar(DefaultValue), Buffer,1024*KiloBytes, PChar(IniFileName)));
    FreeMem(Buffer,1024*KiloBytes); }

    {这个也可以

    SetLength(vBuffer,1024*KiloBytes);
    Buffer:=PChar(vBuffer);
    SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
    PChar(IniKey), PChar(DefaultValue), Buffer,1024*KiloBytes, PChar(IniFileName)));
    SetLength(vBuffer,0);}


    end;

    //调用 //这个调用的变量我就不解释了,结合测试部分的代码就能完全看懂

    vStr:=SysPubMethod_u.IniFileReadStringEx(SettingName,'FormFilterSet','{}',TCustomIniFile(FFormIniFile).FileName);

    --------项目中实际用到的代-----结束--------------

  • 相关阅读:
    [Web] 被遗忘的知识点 XHTML
    [项目实践进阶篇] Android 项目中使用Ant + Groovy能干什么?
    使用Ant,第1部分:将Ant脚本引入Java项目
    [Web] 被遗忘的知识点 JavaScript加载管理最佳实践
    [Web] 被遗忘的知识点 iFrames(HTML)过时了没有?
    Android ProGuard
    stream.js
    GUID(全球唯一标识符)
    解析算术表达式
    LCG(linear congruential generator)伪随机数生成器
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/14504362.html
Copyright © 2011-2022 走看看