Delphi 如何等待async CopyHere(Shell API命令)完成压缩?
我需要在Delphi中压缩和解压文件,而不使用第三方组件。 如何等待异步复制完成压缩 以下代码工作不正常。 使用ShellAPI压缩文件的代码Delphi 如何等待async CopyHere(Shell API命令)完成压缩?,delphi,winapi,asynchronous,process,zipfile,Delphi,Winapi,Asynchronous,Process,Zipfile,我需要在Delphi中压缩和解压文件,而不使用第三方组件。 如何等待异步复制完成压缩 以下代码工作不正常。 使用ShellAPI压缩文件的代码 procedure TShellZip.ZipFolder(const SourceFolder: WideString); var SrcFldr, DestFldr: OleVariant; ShellFldrItems: Olevariant; NumT: Integer; begin if not FileExists(ZipFi
procedure TShellZip.ZipFolder(const SourceFolder: WideString);
var
SrcFldr, DestFldr: OleVariant;
ShellFldrItems: Olevariant;
NumT: Integer;
begin
if not FileExists(ZipFile) then
begin
CreateEmptyZip;
end;
NumT := NumProcessThreads;
ShellObj := CreateOleObject('Shell.Application');
SrcFldr := GetNameSpaceObj(SourceFolder);
if not IsValidDispatch(SrcFldr) then
begin
raise EInvalidOperation.CreateFmt('<%s> Local de origem inválido.', [SourceFolder]);
end;
DestFldr := GetNameSpaceObj_ZipFile;
ShellFldrItems := SrcFldr.Items;
if (Filter <> '') then
begin
ShellFldrItems.Filter(SHCONTF_INCLUDEHIDDEN or SHCONTF_NONFOLDERS or SHCONTF_FOLDERS, Filter);
end;
DestFldr.CopyHere(ShellFldrItems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
//wailt async processes
while NumProcessThreads <> NumT do
begin
Sleep(100);
end;
end;
创建空zip流的代码
procedure TShellZip.CreateEmptyZip;
const
EmptyZip: array[0..23] of Byte = (80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
var
Ms: TMemoryStream;
begin
//criar um arquivo zip vazio
Ms := TMemoryStream.Create;
try
Ms.WriteBuffer(EmptyZip, SizeOf(EmptyZip));
Ms.SaveToFile(ZipFile);
finally
Ms.Free;
end;
end;
您不需要自动化shell来实现这一点。正如你所发现的那样,要做到干净并不容易
您可以使用Delphi附带的ZIP组件。如果您有一个旧版本的Delphi,其中不包括此组件,那么您应该使用第三方组件,如。谢谢David。单元TZIP文件仅存在于Delphi XE2中。你能帮我在Delphi 2010中完成这项工作吗?嗯,是XE。无论如何,这个问题没有指定版本,所以这个答案很好。例如,对于使用2010的用户,您需要使用abbrevia。我使用它来执行应用程序压缩任务。
procedure TShellZip.CreateEmptyZip;
const
EmptyZip: array[0..23] of Byte = (80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
var
Ms: TMemoryStream;
begin
//criar um arquivo zip vazio
Ms := TMemoryStream.Create;
try
Ms.WriteBuffer(EmptyZip, SizeOf(EmptyZip));
Ms.SaveToFile(ZipFile);
finally
Ms.Free;
end;
end;