Delphi TZipMaster - 如何使用Find方法?

时间:2011-08-09 06:49:16

标签: delphi

使用Delphi XE,TZipMaster 1.91(最新版)

我想获得与传递给Find函数的FSpec arg匹配的第一个文件名的文件名。但是,我在调用此函数时遇到访问冲突。

  var
    DBBakFl : String;
    d : Integer;
  begin
    ZipMaster191.ZipFileName := 'myzip.zip';

    try
      DBBakFl := ZipMaster191.Find('*.FBK', d).FileName;
    except
      raise Exception.Create('Find raised an exception');
    end;

任何帮助表示感谢。

编辑: 我发了一封电子邮件,得到了该组件的一位作者Russell Peters的即时答复。 请参阅下面的答案。

3 个答案:

答案 0 :(得分:2)

尝试类似:

 var
   DBBakFl : String;
   d : Integer;
   DirEntry: TZMDirEntry;
 begin
   ZipMaster191.ZipFileName := 'myzip.zip';

   DirEntry := ZipMaster191.Find('*.FBK', d);
   if Assigned(DirEntry) then
   begin
     DBBakF1 := DirEntry.FileName;
     ....
   end;

由于查找失败,您正在尝试的是从nil TZMDirEntry获取文件名。基本上与:

相同
var
  DBBakFl : String;
  DirEntry: TZMDirEntry;
begin

  DirEntry := nil;
  DBBakF1 := DirEntry.FileName;
end;

答案 1 :(得分:1)

如果对Find的调用失败,则不会返回有效的TZMDirEntry实例,因此您无法访问FileName属性。

尝试将Find的结果分配给变量并在尝试访问其属性或方法之前检查其是否有效。也许这样的事情。文档显示TZMDirEntry是一个抽象类,因此您可能需要使用后代类。

  var
    DBBakFl : String;
    d : Integer;
    lDirEntry: TZMDirEntry;
  begin
    ZipMaster191.ZipFileName := 'myzip.zip';

    lDirEntry := ZipMaster191.Find('*.FBK', d);
    if Assigned(lDirEntry) then
      DBBakFl := lDirEntry.FileName
    else
      ShowMessage('file not found');

答案 2 :(得分:1)

我发了一封电子邮件,得到了该组件的一位作者Russell Peters的即时答复:

  

我得到AV

并不奇怪
var
  Idx: Integer;
  Entry: TZMDirEntry;
   DBBakFl : String;
 begin
 try
   Idx := -1;  // search from beginning, starts at Idx + 1
   Index := ZipMaster191.Find('*.FBK', Idx);
   if Index <> nil then
      DBBakFl := Index .FileName;
 except
   raise Exception.Create('Find raised an exception');
 end;

OR
var
  Idx: Integer;
   DBBakFl : String;
 begin
 try
   Idx := -1;  // search from beginning, starts at Idx + 1
   if ZipMaster191.Find('*.FBK', Idx) <> nil then
      DBBakFl := ZipMaster191[Idx].FileName;
 except
   raise Exception.Create('Find raised an exception');
 end;

OR

var
  Idx: Integer;
   DBBakFl : String;
 begin
 try
   Idx := -1;  // search from beginning, starts at Idx + 1
   ZipMaster191.Find('*.FBK', Idx) ;
   if Idx >= 0 then
      DBBakFl := ZipMaster191[Idx].FileName;
 except
   raise Exception.Create('Find raised an exception');
 end;

In a loop it is easy

Idx := -1;
while ZipMaster191.Find('*.FBK', Idx) <> nil do
begin
      DBBakFl := ZipMaster191[Idx].FileName;
     

罗素彼得斯