Entwickler-Ecke

Dateizugriff - ZipMaster Methode Find() gibt NIL zurück


Stephan.Woebbeking - Mo 27.02.12 12:37
Titel: ZipMaster Methode Find() gibt NIL zurück
Hallo *,

ich arbeite mit ZipMaster191 und kann die Find() Methode nicht nutzen. In der Funktion unten gibt es zwei markante Codeteile, deren Ergebnis in "Punkt 1" und "Punkt 2" sichtbar (Debugger) sein sollte. An "Punkt 1" ist fileData NIL und a wird mit -1 belegt (Habe auch schon bei 0 angefangen zu suchen, das hilft auch nix; auch einen Cast des String in TZMString hab ich schon probiert). Dagegen ist an "Punkt 2" in fileData korrekt die Information von dem gesuchten MANIFEST_FILE gespeichert. Kann mir jemand sagen, warum das so ist?

Danke,
Stephan



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TFormServiceSK_M.BtnOpenUpdateFileClick(Sender: TObject);
var
  ct, a, bfLen, pos1, pos2: Integer;
  fileData: TZMDirEntry;
  buffer: PChar;
  mStream: TMemoryStream;
  manifestContent, line: String;
  stringList: TStringList;
begin
  // Ask the user for the file to be opened
  DlgOpenFW.DefaultExt := FIRMWARE_EXT;
  if ( DlgOpenFW.Execute ) then begin
    logger.Info( 'BtnOpenUpdateFileClick() FWFilename = ''' + FWFilename + '''' );
    FWFilename := DlgOpenFW.FileName;
    // Expecte a ZIP file and extract the manifest file
    ZipMaster191.ZipFileName := FWFilename;
    ct := ZipMaster191.Count; // counts the overall number of files stored in the zip archive
    logger.Info( 'Open file "' + DlgOpenFW.Filename + '" which contains ' + IntToStr( ct ) + ' single files.' );
    a := 1;
    fileData := ZipMaster191.Find( MANIFEST_FILE, a ); // ---------------------------------------> Punkt 1
    a := 0;
    repeat
      fileData := ZipMaster191.DirEntry[ a ];
      a := a + 1;
    until ( ( a >= ZipMaster191.Count ) OR ( fileData.FileName = MANIFEST_FILE ) );
    if NOT( Assigned( fileData ) ) then begin // ---------------------------------------> Punkt 2
      // Uuups, manifest not found
      logger.Error( 'Archive ' + FWFilename + ' does not contain a ' + MANIFEST_FILE + ' file!' );
    end else begin
      // Read out the content of the manifest file
      ..............
      // Having done this, we have to investigate the lines one by one
    end;

  end;
end;


SvenAbeln - Mo 27.02.12 14:34

Versuch es mal so:

Delphi-Quelltext
1:
2:
    a := -1;
    fileData := ZipMaster191.Find( MANIFEST_FILE, a );

Laut der Hilfe, beginnt die Suche beim übergebenen Index + 1.


Stephan.Woebbeking - Mo 27.02.12 16:34

Wow, das klappt, ganz herzlichen Dank dafür!!! Ich hatte die Hilfe - auf der Webseite "http://www.delphizip.org" auch studiert, aber da bin ich nicht drauf gestossen. Hab auch mehr Doku gefunden, welche Doku hast du genommen?

Vielen Dank & viele Grüße,
Stephan


SvenAbeln - Di 28.02.12 11:14

Ich kannte die Zipmaster bisher nicht, deswegen hab ich es gegoogelt.
Der erste Treffer war www.delphizip.org [http://www.delphizip.org/], dort habe ich in die Hilfe geschaut.
Der zweite Treffer bei google war übrigens eine Frage bei stackoverflow: "Delphi TZipMaster - how to use the Find method?" :wink: