Delphi - ZIP 文件中的文本到备忘录

Delphi - Text from file in ZIP to Memo

在一些 ZIP 文件中我有文件 head.txt。我想将此文件中的文本复制到我表单上的 TMemo。这是我的代码:

procedure TformMain.LoadProject(InputFileName: string);
var
  MS: TMemoryStream;
  zip: TZipForge;
  txt: string;
begin
  MS := TMemoryStream.Create;
  try
    zip := TZipForge.Create(nil);
    try
      with zip do begin
        FileName := InputFileName;
        OpenArchive(fmOpenReadWrite);
        ExtractToStream('head.txt', MS);
        CloseArchive;
      end;
    finally
      zip.Free;
    end;
    MS.Seek(0, soFromBeginning);
    SetLength(txt, MS.Size);
    MS.Write(txt[1], MS.Size);
  finally
    MS.Free;
  end;
  if Length(txt) > 0 then Memo1.Lines.Text := txt;
end;

但是没用。 在我的 ZIP 文件中的 head.txt 中是:

123456
abcdef
xxxx

备忘录中的结果是:

auto-suggest dropdow

感谢帮助!

尝试替换此代码:

MS.Seek(0, soFromBeginning);
SetLength(txt, MS.Size);
MS.Write(txt[1], MS.Size);

致电 SetString

SetString(txt, PAnsiChar(MS.Memory), MS.Size);

喜欢this question

问题是,您实际上是将数据从 txt 变量写入内存流,而不是使用 Read 方法将数据从内存流读取到您的 txt 变量。

因此您的代码应该更像这样

procedure TformMain.LoadProject(InputFileName: string);
var
  MS: TMemoryStream;
  zip: TZipForge;
  txt: string;
begin
  MS := TMemoryStream.Create;
  try
    zip := TZipForge.Create(nil);
    try
      with zip do begin
        FileName := InputFileName;
        OpenArchive(fmOpenReadWrite);
        ExtractToStream('head.txt', MS);
        CloseArchive;
      end;
    finally
      zip.Free;
    end;
    MS.Seek(0, soFromBeginning);
    SetLength(txt, MS.Size);
    MS.Read(txt, MS.Size);
  finally
    MS.Free;
  end;
  if Length(txt) > 0 then Memo1.Lines.Text := txt;
end;

我还没有测试过。

但由于您想将该文件中的文本加载到 Memo 中,您可以通过删除 txt 变量和它所需的所有麻烦来简化此操作,并直接从内存流中将文本加载到 memo 中,如下所示:

Memo1.Lines.LoadFromStream(MS);

因此您的最终代码应如下所示:

procedure TformMain.LoadProject(InputFileName: string);
var
  MS: TMemoryStream;
  zip: TZipForge;
begin
  MS := TMemoryStream.Create;
  try
    zip := TZipForge.Create(nil);
    try
      with zip do begin
        FileName := InputFileName;
        OpenArchive(fmOpenReadWrite);
        ExtractToStream('head.txt', MS);
        CloseArchive;
      end;
    finally
      zip.Free;
    end;
    MS.Seek(0, soFromBeginning);
    Memo1.Lines.LoadFromStream(MS);
  finally
    MS.Free;
  end;
end;