anchor.diff:    else
       raise EAbArchiveBusy.Create;
   end;
  -
   { -------------------------------------------------------------------------- }
   function AbDetermineArcType(const FN : string; AssertType : TAbArchiveType) : TAbArchiveType;
   var
     Ext : string;
     FS : TFileStream;
   begin
  -  Ext := UpperCase(ExtractFileExt(FN));
  -  Result := atUnknown;
  -
  -  if AssertType = atUnknown then begin { use file extension as first guess }
  -    if not FileExists(FN) or (AbFileGetSize(FN) = 0) then begin          {!!.01}
  -    { file doesn't exist (or is empty) so presume to make one }          {!!.01}
  -      if Ext = '.ZIP' then
  -        Result := atZip;
  -      if Ext = '.JAR' then {!!.05}
  -        Result := atZip;
  -      if Ext = '.TAR' then
  -        Result := atTar;
  -      if (Ext = '.GZ') then
  -        Result := atGzip;
  -      if (Ext = '.TGZ') then
  -        Result := atGzippedTar;
  -      if (Ext = '.CAB') then
  -        Result := atCab;
  -    end
  -    else begin  { file exists so guess that's what it is and double check }
  -      FS := TFileStream.Create(FN, fmOpenRead or fmShareDenyNone);
  -      try
  -        Ext := UpperCase(ExtractFileExt(FN));
  -
  -        if Ext = '.EXE' then
  +  Result := AssertType;
  +  if Result = atUnknown then begin
  +    { Guess archive type based on it's extension }
  +    Ext := UpperCase(ExtractFileExt(FN));
  +    if (Ext = '.ZIP') or (Ext = '.JAR') then
  +      Result := atZip;
  +    if Ext = '.TAR' then
  +      Result := atTar;
  +    if (Ext = '.GZ') then
  +      Result := atGzip;
  +    if (Ext = '.TGZ') then
  +      Result := atGzippedTar;
  +    if (Ext = '.CAB') then
  +      Result := atCab;
  +  end;
  +{$IFNDEF MSWINDOWS}
  +  if Result = atCab then
  +    Result := atUnknown;
  +{$ENDIF}
  +  if (Result <> atUnknown) and FileExists(FN) and (AbFileGetSize(FN) > 0) then begin
  +    { If the file doesn't exist (or is empty) presume to make one, otherwise
  +      verify the contents }
  +    FS := TFileStream.Create(FN, fmOpenRead or fmShareDenyNone);
  +    try
  +      case Result of
  +        atZip : begin
  +          Result := VerifyZip(FS);
  +        end;
  +        atSelfExtZip : begin
             Result := VerifySelfExtracting(FS);
  -        if Ext = '.ZIP' then
  -          Result := VerifyZip(FS);
  -        if Ext = '.JAR' then        {!!.05}
  -          Result := VerifyZip(FS);
  -        if Ext = '.TAR' then
  +        end;
  +        atTar : begin
             Result := VerifyTar(FS);
  -        if (Ext = '.GZ') or (Ext = '.TGZ') then
  +        end;
  +        atGzip, atGzippedTar: begin
             Result := VerifyGzip(FS);
  +        end;
   {$IFDEF MSWINDOWS}
  -        if (Ext = '.CAB') then
  +        atCab : begin
             Result := VerifyCab(FN);
  +        end;
   {$ENDIF}
  -      finally
  -        FS.Free;
         end;
  -    end;
  -
  -  end
  -  else begin  { we're told what it's supposed to be, so ignore file extension }
  -    if not FileExists(FN) then
  -      Result := AssertType
  -    else begin
  -      FS := TFileStream.Create(FN, fmOpenRead or fmShareDenyNone);
  -      try
  -        case AssertType of
  -          atZip : begin
  -            Result := VerifyZip(FS);
  -          end;
  -          atSelfExtZip : begin
  -            Result := VerifySelfExtracting(FS);
  -          end;
  -          atTar : begin
  -            Result := VerifyTar(FS);
  -          end;
  -          atGzip, atGzippedTar: begin
  -            Result := VerifyGzip(FS);
  -          end;
  -{$IFDEF MSWINDOWS}
  -          atCab : begin
  -            Result := VerifyCab(FN);
  -          end;
  -{$ENDIF}
  -        end;
  -      finally
  -        FS.Free;
  -      end;
  +    finally
  +      FS.Free;
       end;
     end;
   end;
  
positive.code: { -------------------------------------------------------------------------- }
  destructor TAbBaseBrowser.Destroy;
  begin
   if Assigned(FArchive) then
    FArchive.Free;
    FArchive := nil;
    inherited Destroy;
  
negative.code:   AbUtils,
    AbArcTyp;
  
  type
    TAbBaseMeterLink = class(TAbBaseComponent)
    public
      procedure DoProgress(Progress : Byte); virtual; abstract;
      procedure Reset; virtual; abstract;
    end;
  
    TAbBaseBrowser = class(TAbBaseComponent)
  