CnPack Forum


 
Subject: 向Ini文件中写入流数据
不得闲
灌水科科长
Rank: 3Rank: 3



UID 40680
Digest Posts 3
Credits 118
Posts 33
点点分 118
Reading Access 10
Registered 2008-7-23
Status Offline
Post at 2008-8-3 15:50  Profile | Blog | P.M. 
向Ini文件中写入流数据

Delphi中使用Ini文件是非常方便的,很简单的就可以操作一个Ini文件。但是也存在着局限性,比如TIniFile的ReadString函数
最大只能读2047个字符,超过了的则读不出来,鉴于这个,很容易的修改,可以找到其ReadString函数,扩大其缓冲区则可。
同时还有一点不足之处就是,不能写入流。写入流有的时候,用处也是非常大的了。但是Ini文件却没有提供该函数,进日由于
工作中需要用到这样的东西,于是想了一个办法能够在Ini文件中读写流数据。发来与大家分享一下。
其实写入流数据也是输入字符串。众所周知,Ini文件中输入的字符串不能换行,否则换行后的字符串则成一个非有效的值了。
所以,把流数据当字符串输入的时候,就要防止其有换行符号,于是想到一个办法,先把他变成16进制字符串,然后在写入
这样就防止了换行。读出来,也就把16进制字符串再转换成二进制数据。
所以就需要如下几个函数了:

Function StreamToStr(Value: TStream): String; //流转化成16进制字符串
Function StrToStream(Const aStr: String; Value: TStream): Integer;//16进制字符串化为流数据
Function ReadStream(Const Section,aParamName: String; aValue: TStream): Integer;//读取流
Procedure WriteStream(Const Section,aParamName: String; aValue: TStream);//写入流

function TIniFile.StreamToStr(Value: TStream): String;
begin
  result := PointToHex(TMemoryStream(Value).memory,Value.Size); //该函数我以前有写过,请看以前的帖子
end;


function TIniFile.StrToStream(const aStr: String;
  Value: TStream): Integer;
Var
  Text: String;
  Stream: TMemoryStream;
  Pos: Integer;
Begin
  Text := aStr;
  If Text <> '' Then
  Begin
    If Value Is TMemoryStream Then
      Stream := TMemoryStream(Value)
    Else
      Stream := TMemoryStream.Create;
    Try
      Pos := Stream.Position;
      Stream.SetSize(Stream.Size + Length(Text) Div 2);
      //转换成二进制流数据,看以前的帖子     
      HexToBin(Text, Pointer(Integer(Stream.Memory) + Stream.Position), Length(Text) Div 2);     
      Stream.Position := Pos;
      If Value <> Stream Then Value.CopyFrom(Stream, Length(Text) Div 2);
      Result := Stream.Size - Pos;
    Finally
      If Value <> Stream Then Stream.Free;
    End;
  End
  Else
    Result := 0;
end;


function TIniFile.ReadStream(const Section, aParamName: String;
  aValue: TStream): Integer;
Var
  mValue: String;  
begin
  mValue := ReadString(Section,aParamName, '');
  Result := StrToStream(mValue, aValue);
end;

procedure TIniFile.WriteStream(const Section, aParamName: String;
  aValue: TStream);
Var
  mValue: String;
Begin
  mValue := StreamToStr(aValue);
  WriteString(Section,aParamName, mValue);
end;

[ 本帖最后由 不得闲 于 2008-8-3 15:54 编辑 ]
Top
lixupeng
普通灌水员
Rank: 2



UID 33687
Digest Posts 0
Credits 66
Posts 31
点点分 66
Reading Access 10
Registered 2007-12-11
Status Offline
Post at 2008-8-3 20:32  Profile | Blog | P.M. 
顶下
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2008-8-7 15:50  Profile | Site | Blog | P.M.  | QQ | Yahoo!
INI每行长度不大,只适合写比较小的数据。




小冬
http://MyvNet.com
Top
不得闲
灌水科科长
Rank: 3Rank: 3



UID 40680
Digest Posts 3
Credits 118
Posts 33
点点分 118
Reading Access 10
Registered 2008-7-23
Status Offline
Post at 2008-8-7 22:24  Profile | Blog | P.M. 
恩!确实如此,流太大的就别用!只推荐小型数据的操作
本来我用这个也是特殊需要。
Top
hbxfwjww (流星无语)
普通灌水员
Rank: 2



UID 14409
Digest Posts 0
Credits 87
Posts 36
点点分 87
Reading Access 10
Registered 2007-5-18
Status Offline
Post at 2008-8-21 21:46  Profile | Blog | P.M.  | QQ
个人意见:感觉麻烦,还不如直接写到文件里




我就是我!
Top
 




All times are GMT++8, the time now is 2024-4-20 12:19

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.007445 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP