首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TIniFile.WriteBinaryStream创建异常

TIniFile.WriteBinaryStream创建异常
EN

Stack Overflow用户
提问于 2020-08-02 12:29:59
回答 1查看 224关注 0票数 2

在Delphi10.4中,我尝试将有效的TPicture base64 64保存到INI文件中:

代码语言:javascript
复制
procedure TForm1.SavePictureToIniFile(const APicture: TPicture);
var
  LInput: TMemoryStream;
  LOutput: TMemoryStream;
  MyIni: TIniFile;
  ThisFile: string;
begin
  if FileSaveDialog1.Execute then
    ThisFile := FileSaveDialog1.FileName
  else EXIT;

  LInput := TMemoryStream.Create;
  LOutput := TMemoryStream.Create;
  try
    APicture.SaveToStream(LInput);
    LInput.Position := 0;
    TNetEncoding.Base64.Encode(LInput, LOutput);
    LOutput.Position := 0;

    MyIni := TIniFile.Create(ThisFile);
    try
      MyIni.WriteBinaryStream('Custom', 'IMG', LOutput); // Exception# 234
    finally
      MyIni.Free;
    end;
  finally
    LInput.Free;
    LOutput.Free;
  end;
end;

WriteBinaryStream创建了一个异常:

ERROR_MORE_DATA 234 (0xEA)更多数据可用。

为什么?这是什么意思?如何解决这个问题呢?

编辑:考虑到@Uwe Raabe和@Andreas所说的话,这段代码(不使用base64 64-编码)现在起作用了:

代码语言:javascript
复制
procedure TForm1.SavePictureToIniFile(const APicture: TPicture);
var
  LInput: TMemoryStream;
  MyIni: System.IniFiles.TMemIniFile;
  ThisFile: string;
begin
  if FileSaveDialog1.Execute then
    ThisFile := FileSaveDialog1.FileName
  else EXIT;

  LInput := TMemoryStream.Create;
  try
    APicture.SaveToStream(LInput);
    LInput.Position := 0;

    MyIni := TMemIniFile.Create(ThisFile);
    try
      MyIni.WriteBinaryStream('Custom', 'IMG', LInput);
      MyIni.UpdateFile;
    finally
      MyIni.Free;
    end;
  finally
    LInput.Free;
  end;
end;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-02 12:39:27

我认为这是操作系统处理INI文件的功能的一个限制;字符串对它来说太长了。

如果您使用Delphi文件实现,TMemIniFile,它工作得很好。不过,别忘了在最后给MyIni.UpdateFile打电话。

是的,这确实是Windows中的一个限制,下面的最小示例说明了这一点:

代码语言:javascript
复制
var
  wini: TIniFile;
  dini: TMemIniFile;
begin

  wini := TIniFile.Create('C:\Users\Andreas Rejbrand\Desktop\winini.ini');
  try
    wini.WriteString('General', 'Text', StringOfChar('W', 10*1024*1024));
  finally
    wini.Free;
  end;

  dini := TMemIniFile.Create('C:\Users\Andreas Rejbrand\Desktop\pasini.ini');
  try
    dini.WriteString('General', 'Text', StringOfChar('D', 10*1024*1024));
    dini.UpdateFile;
  finally
    dini.Free;
  end;

(回想一下INI文件最初用于存储16位Windows时代的少量配置数据。)

也是乌韦·拉比是正确的:您应该将Base64字符串保存为文本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63216011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档