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;
在一些 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;