Einzelnen Beitrag anzeigen

Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

Datei Parsen mittels RegExpr

  Alt 20. Apr 2009, 16:18
Hallo Gemeinde,

Ich habe ein Updateprogramm geschrieben. Das Funktioniert folgendermaßen : Dem programm wird ein HTTP Link übergeben. Ein Link von einer TXT Datei die geparst werden soll. In der Zeit ist das Programm noch nicht sichtbar. Dannach wird die Datei aufgerufen und geparst. Ich benutze folgenden Code zum parsen und bin der Meinung dass die Lösung einfach nicht sauber ist. Gibt es eine bessere Alternative?

Delphi-Quellcode:
procedure TUpdate.FileParse(strFile : string);
var
  Datei: TextFile;
  RegEx : TRegExpr;
  strZeile : string;
  intCountDownloads, intMaxDownloads : integer;
begin

  // standart werte zuweisen
  intCountDownloads := 0;
  intMaxDownloads := 0;
  boolExitLoop := false;

  // RegEx Objekt erzeugen und flags setzen
  RegEx := TRegExpr.Create;
  RegEx.ModifierI := true;

  // datei verbindung erzeugen / handle erzeugen
  AssignFile(Datei, strFile);

  // datei öffnen
  Reset(Datei);

  // downloads zählen für ProgressBarAll.Max und setzen
  while not eof(Datei) do
  begin
    ReadLn(Datei, strZeile);
    RegEx.Expression := '^\s*download\s*\".+\"\s*as\s*\".+\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
      intMaxDownloads := intMaxDownloads+1;
    end;
  end;
  ProgressBarAll.Max := intMaxDownloads;

  // Datei erneut öffnen (Zeiger Position auf 1 setzen!?) - unsauber!
  Reset(Datei);


  // Updatedatei parsen
  while (not eof(Datei)) and (not boolExitLoop) do
  begin

    ReadLn(Datei, strZeile);

    // create directory
    RegEx.Expression := '^\s*create\s*directory\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Create Dir.: ' + RegEx.Match[1]);
        if not DirectoryExists(RegEx.Match[1]) then
        begin
          CreateDir(RegEx.Match[1]);
        end;
    end;

    // down
    RegEx.Expression := '^\s*down\s*\"(.+)\"\s*as\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
      WriteToLog('Script: Download File (Invisible)');
      try
        HTTPDownloadFile(RegEx.Match[1],RegEx.Match[2]);
      except
        ShowMessage('Error: Download File');
      end;
    end;

    // download
    RegEx.Expression := '^\s*download\s*\"(.+)\"\s*as\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
      WriteToLog('Script: Download File');
      if intMaxDownloads > 0 then
      begin
        inc(intCountDownloads);
        LabelFileNummer.Caption := IntToStr(intCountDownloads) + ' / ' + IntToStr(intMaxDownloads);
        ProgressBarAll.StepIt;
      end else begin
        LabelFileNummer.Caption := IntToStr(intCountDownloads);
      end;
      try
        HTTPDownloadFile(RegEx.Match[1],RegEx.Match[2]);
      except
        ShowMessage('Error: Download File');
      end;
    end;

    // exit
    RegEx.Expression := '^\s*exit\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Exit');
        boolExitLoop := true;
        break;
    end;

    // open background xy
    RegEx.Expression := '^\s*set\s*background\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Set Backgroundimage: ' + RegEx.Match[1]);
        if FileExists(RegEx.Match[1]) then
        begin
          ImageHead.Picture.LoadFromFile(RegEx.Match[1]);
        end;
    end;

    // open background xy
    RegEx.Expression := '^\s*set\s*visible\s*\"(\d)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Set Form Visible: ' + RegEx.Match[1]);
        if StrToInt(RegEx.Match[1]) > 0 then
        begin
          Self.Visible := true;
        end else begin
          Self.Visible := false;
        end;
    end;

    // open background xy
    RegEx.Expression := '^\s*show\s*\"(.+)\"\s*as\s*INFO$';
    if RegEx.Exec(strZeile) then
    begin
      MessageDlg(RegEx.Match[1],mtInformation, [mbOK], 0);
    end;

  end;

  // Datei schließen
  CloseFile(Datei);

  // Falls Exit beim Parsen aufgerufen worden ist...
  if boolExitLoop then
  begin
    Self.CleanUpInstance; // Löscht Temp. Dateien etc
    Application.Terminate;
  end;

end;

Zu Parsen ist folgende Datei :
Code:
#!update:script  <-------- Dies soll später als Identifikationszeile dienen

// lädt Hintergrundbild herunter (ohne Counter)
down "http://xxxxxxxxxxxxxxxxxxxxxxx/media_repository/files/mediakit/thumb_internetcafe_6x3.jpg" as "background.jpg"

// zeigt die form an
set visible    "1"

// setzt Hintergrund
set background    "background.jpg"

// erstellt falls es noch nicht existiert ein Verzeichnis
create directory "./Download"

// Lädt Dateien herunter
download "http://real-ttx.xxxxxxxx.de/dir1/dir2/dir3/dir4/dir5/PHP.rar" as "./Download/PHP_TEST.rar"
download "http://www.real-ttx.de/xxxx.rar"             as "./Download/xxxx.rar"
download "http://www.real-ttx.de/yyyy.rar"           as "./Download/yyyy.rar.rar"

// versteckt form
set visible   "0"

// Zeigt eine Msg Dialog an (als Infobox=Ausrufezeichen)
show "Das Update wurde erfolgreich heruntergeladen" as info

// Beendet den Updater (am Client)
exit
Danke euch
  Mit Zitat antworten Zitat