Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何等待async CopyHere(Shell API命令)完成压缩?_Delphi_Winapi_Asynchronous_Process_Zipfile - Fatal编程技术网

Delphi 如何等待async CopyHere(Shell API命令)完成压缩?

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

我需要在Delphi中压缩和解压文件,而不使用第三方组件。 如何等待异步复制完成压缩

以下代码工作不正常。

使用ShellAPI压缩文件的代码

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;