向Ini文件中写入流数据

来源:互联网 发布:读文件 java 编辑:程序博客网 时间:2024/05/16 18:32
 Delphi中使用Ini文件是非常方便的,很简单的就可以操作一个Ini文件。但是也存在着局限性,比如TIniFile的ReadString函数
最大只能读2047个字符,超过了的则读不出来,鉴于这个,很容易的修改,可以找到其ReadString函数,扩大其缓冲区则可。
同时还有一点不足之处就是,不能写入流。写入流有的时候,用处也是非常大的了。但是Ini文件却没有提供该函数,进日由于
工作中需要用到这样的东西,于是想了一个办法能够在Ini文件中读写流数据。发来与大家分享一下。
其实写入流数据也是输入字符串。众所周知,Ini文件中输入的字符串不能换行,否则换行后的字符串则成一个非有效的值了。
所以,把流数据当字符串输入的时候,就要防止其有换行符号,于是想到一个办法,先把他变成16进制字符串,然后在写入
这样就防止了换行。读出来,也就把16进制字符串再转换成二进制数据。
所以就需要如下几个函数了:
  1. Function StreamToStr(Value: TStream): String; //流转化成16进制字符串
  2. Function StrToStream(Const aStr: String; Value: TStream): Integer;//16进制字符串化为流数据
  3. Function ReadStream(Const Section,aParamName: String; aValue: TStream): Integer;//读取流
  4. Procedure WriteStream(Const Section,aParamName: String; aValue: TStream);//写入流
  5. function TIniFile.StreamToStr(Value: TStream): String;
  6. begin
  7.   result := PointToHex(TMemoryStream(Value).memory,Value.Size); //该函数我以前有写过,请看以前的帖子
  8. end;
  9. function TIniFile.StrToStream(const aStr: String;
  10.   Value: TStream): Integer;
  11. Var
  12.   Text: String;
  13.   Stream: TMemoryStream;
  14.   Pos: Integer;
  15. Begin
  16.   Text := aStr;
  17.   If Text <> '' Then
  18.   Begin
  19.     If Value Is TMemoryStream Then
  20.       Stream := TMemoryStream(Value)
  21.     Else
  22.       Stream := TMemoryStream.Create;
  23.     Try
  24.       Pos := Stream.Position;
  25.       Stream.SetSize(Stream.Size + Length(Text) Div 2);
  26.       //转换成二进制流数据,看以前的帖子     
  27.       HexToBin(Text, Pointer(Integer(Stream.Memory) + Stream.Position), Length(Text) Div 2);     
  28.       Stream.Position := Pos;
  29.       If Value <> Stream Then Value.CopyFrom(Stream, Length(Text) Div 2);
  30.       Result := Stream.Size - Pos;
  31.     Finally
  32.       If Value <> Stream Then Stream.Free;
  33.     End;
  34.   End
  35.   Else
  36.     Result := 0;
  37. end;
  38. function TIniFile.ReadStream(const Section, aParamName: String;
  39.   aValue: TStream): Integer;
  40. Var
  41.   mValue: String;  
  42. begin
  43.   mValue := ReadString(Section,aParamName, '');
  44.   Result := StrToStream(mValue, aValue);
  45. end;
  46. procedure TIniFile.WriteStream(const Section, aParamName: String;
  47.   aValue: TStream);
  48. Var
  49.   mValue: String;
  50. Begin
  51.   mValue := StreamToStr(aValue);
  52.   WriteString(Section,aParamName, mValue);
  53. end;

原创粉丝点击