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
- 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.
- 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.
- 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.