HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material

Delphi-Lösch-Werkzeug "ddel"

Gruppe: mk, 12.2.04

Aufgabenstellung

Beim Arbeiten mit Delphi entstehen viele Dateien, die für eine Archivierung der Projekte nicht nötig sind aber viel Platz wegnehmen. Es soll ein Programm erstellt werden, das hier Abhilfe schafft.

Systemanalyse

Es muss gründlich recherchiert werden, welche Bedeutung die einzelnen Dateien eines Delphi- Projekts haben:
Dateien im Projekt, OSZ Berlin

Auch die Bedeutung von Pfad, Pfadname, Dateiname, "\", .. muss geklärt werden:
Einführung in MS-DOS, FH München, ms-dos-Kurs, Humboldt-Universität Berlin, Dos-Kurs, Universität Paderborn

Teilziele

  1. Die Aufgabenstellung erfordert einen Zugang zum Dateisystem von der Hochsprache aus. In einem ersten Schritt sollen die eingebauten Bibliotheks-Routinen gefunden werden. Hierzu wird eine Suche im Hilfssystem erforderlich sein. Mit "kleinen Fingerübungen" soll ein Verständnis der Routinen erreicht werden. Eventuell müssen Programmier-Lücken geschlossen werden.
  2. In Teilschritten soll eine Lösung der Aufgabenstellung mit einer grafischen Oberfläche erstellt werden. Die grafische Oberfläche soll hauptsächlich Debug-Zwecken dienen.
  3. Im letzten Schritt soll die grafische Lösung zu einer reinen Console-Anwendung reduziert werden. Dabei sollen übliche Anforderungen an solche Anwendungen wie Hilfen zur Bedienung eingebaut werden.

Pflichtenheft zur 1.Teilaufgabe

/1/ Routinen zum Zugriff auf das Dateisystem sollen aufgelistet und kurz beschrieben werden.
/2/ Benötigte Datenstrukturen sollen beschrieben werden.
/3/ Das Setzen, Löschen und Ermitteln von Einzelbits mit and, or .. soll erläutert werden.

Pflichtenheft zur 2.Teilaufgabe

/1/ Eingabe einer Suchmaske
/2/ Ausgabe gefundener Dateien
/3/ Ordnerweises Bearbeiten der Dateien: Suchen aller exe-Dateien, Löschen einer exe-Datei, wenn eine zugehörige dpr-Datei existiert, Löschen von backup-Dateien, Löschen von dcu-Dateien
/4/ Dokumentation der Bearbeitung durch entsprechende Ausgaben

Prototyp

Objektorientierte Analyse

Im Hinblick auf eine Wiederverwertbarkeit ist eine objektorientierte Darstellung zu prüfen.

Objektorientiertes Design

Zur Bearbeitung eine verschachtelten Ordnerstruktur bietet sich eine rekursive Lösung an.

Implementierung

RekursiveDateisuche.zip

Pflichtenheft zur 3.Teilaufgabe

/1/ Erstellen einer Konsolen-Anwendung ddel
/2/ Ausgabe eines Hilfetextes bei ddel  /? (ddel  ?, ddel  h, ddel  /help)
/3/ Angabe des Startverzeichnisse durch einen Parameter (z.B. ddel  abc\
/4/ Ein zweiter Parameter v (verbose) soll eine gesprächige Ausgabe (z.B. ddel  .\*.*  v) erzeugen.

program ddel;
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes;
var
  maske : string;

  function suffix(f : string) : string;
  var
    i : integer;
  begin
    i := Length(f);
    while (f[i]  '.') and (i > 0) do dec(i);
    if i = 0 then // kein Punkt gefunden
      result := ''
    else
      result := copy(f,i,Length(f)-i+1);
  end;

  procedure bearbeite(maske : string);
  const
    FileAttr = faReadOnly+faHidden+faArchive; // zusätzlich zu normalen D.
  var
    FPfad,Fname,Ftemp : string;
    Search            : TSearchRec;
    FListe            : TStringList;
    i,pos             : integer;
    geloescht         : boolean;
  begin
    // Eingabe aufbereiten **** nicht fertig! *****
    FPfad := ExtractFilePath(maske);
    if FPfad = '' then FPfad := '.\';
    if FPfad[Length(FPfad)]  '\' then FPfad := FPfad+'\';
    FName := ExtractFileName(maske);
    if FName = '' then FName := '*.*';
    maske := FPfad+FName;
    // Liste aufbauen
    FListe := TStringList.Create;
    // Files suchen
    if FindFirst(maske,FileAttr,Search) = 0 then
    repeat
      FListe.Add(FPfad+Search.Name);
    until FindNext(Search)  0;
    FindClose(Search);
    // Liste bearbeiten
    for i := 0 to Fliste.Count-1 do
    begin
      if suffix(FListe[i]) = '.exe' then
      begin
        Ftemp := copy(FListe[i],1,Length(FListe[i])-4);
        Ftemp := Ftemp+'.dpr';
        pos := FListe.IndexOf(Ftemp);
        if pos > -1 then // anscheinend Delphi-Ordner
        begin
          // aktive und schreibgeschützte Dateien werden nicht gelöscht
          geloescht := deleteFile(FListe[i]);
          if (ParamStr(2) = 'v') and geloescht then
            writeLn(FListe[i]+' wurde geloescht.');
          // hier folgen weitere Aktivitäten im Delphi-Ordner
        end;
      end;
      if true then  // **** hier eventuell Schalter einbauen 
      begin
        if (suffix(FListe[i])[2]='~') or
           (suffix(FListe[i])='.dcu') or
           (suffix(FListe[i])='.cfg') or
           (suffix(FListe[i])='.dof') or
           (suffix(FListe[i])='.ddp')
        then
        begin
           geloescht := deleteFile(FListe[i]);
           if (ParamStr(2) = 'v') and geloescht then
             writeLn(FListe[i]+' wurde geloescht.');
        end;
      end;
    end;
    FListe.Free;
    // Unterverzeichnisse bearbeiten
    if FindFirst(maske,faDirectory,Search) = 0 then
    repeat
      if ((Search.Attr and faDirectory) > 0) and
          (Search.Name  '.') and
          (Search.Name  '..')
      then
      begin
        bearbeite(FPfad+Search.Name+'\'+FName);
      end;
    until FindNext(Search)  0;
    FindClose(Search);
  end;

begin

begin
  if ParamCount = 0 then
    maske := '.\*.*'
  else
    if (ParamStr(1) = '?') or
       (ParamStr(1) = '/?') or
       (ParamStr(1) = 'help') or
       (ParamStr(1) = '/h')      then
    begin
      writeLn;
      writeLn('  ddel ist ein Werkzeug, um in Delphi-Projekten ueberfluessige');
      writeLn('  Dateien zu loeschen.');
      writeLn('  ddel wurde vom LK Informatik 12, Abitur 05, HSG Kaiserslautern entwickelt.');
      writeLn('  Beta-Version 0.8 vom 12.2.2004');
      writeLn;
      writeLn('  Als Parameter wird eine Suchmaske wie abc\*.* erwartet.');
      writeLn('  Bei Fehlen des Parameters wird .\*.* angenommen.');
      writeLn('  Fehlt der FileName, so wird *.* ergaenzt.');
      writeLn('  Will man nur den Pfad abc bearbeiten, so ist abc\ anzugeben.');
    end
    else
      maske := ParamStr(1);
  writeLn('ddel 0.8');
  bearbeite(maske);
end;

end.

Test

Hier sind die durchgeführten Tests mit Angabe der Testdaten zu dokumentieren.