Autor Beitrag
Bofrost_Mann
Hält's aus hier
Beiträge: 15

Win XP
Delphi 5, Delphi 2005
BeitragVerfasst: Fr 17.07.09 20:19 
Hallo, nachdem ich lange Zeit nicht zum Programmieren gekommen bin, steh ich gerade ganz schön auf dem Schlauch und hoffe auf Eure Hilfe.

Problem:

Ich möchte eine ganze Ordnerstruktur in zwie Klassen packen, aber ich hänge gerade massiv an dem Rekursionspunkt, d.h. ich bin mir nicht ganz klar darüber, welche Parameter die Prozeduren überhaupt benötigen bzw. ob welche überflüssig sind.
In den Anhang habe ich mal den vorläufigen UML-Entwurf der beiden Klassen gepackt, damit man ungefähr eine Vorstellung hat.


Für den Algorithmus zum rekursiven Durchlaufen der Ordner habe ich diesen hier www.delphi-fundgrube.de/faq03.htm (Abschnitt: Wie kann man alle Dateien eines Ordners mitsamt der Unterverzeichnisse ermitteln?) zur Grundlage genommen.


Hier der Quelltext der jetzigen Unit:


ausblenden volle Höhe 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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
unit Unit2;

interface

Uses
    SysUtils;

type
  TDatei = class
    Name: String;
    Extension: String;
    Groesse: Real;
  private
    procedure setName();
    procedure setExtension();
    procedure setGroesse();
  public
    procedure getName();
    procedure getExtension();
    procedure getGroesse();
  end;

type
  TOrdner = class
    Name: String;
    Unterordner: Array of TOrdner;
    Dateien: Array of TDatei;
  private
    procedure setUnterordner(Name: string; var UO: TOrdner);
    procedure setDateien();
    procedure setName(Name: string);
  public
    constructor Create(AName: String); //override;
    procedure getUnterordner(var UO: TOrdner);
    procedure getDateien();
    procedure getName();
  end;

procedure Verzeichnis_einlesen(Verzeichnis: String; Struktur: TOrdner; var Ordner: TOrdner);
procedure Vz_hilf(Verzeichnis: String; var Ordner: TOrdner);

var
  hilf: TObject;

implementation

//--- private - Prozeduren - TDatei ---//

procedure TDatei.setName();
begin

end;

procedure TDatei.setExtension();
begin

end;

procedure TDatei.setGroesse();
begin

end;

//--- public - Prozeduren - TDatei ---//

procedure TDatei.getName();
begin

end;

procedure TDatei.getExtension();
begin

end;

procedure TDatei.getGroesse();
begin

end;


//--- private - Prozeduren - TOrdner ---//

procedure TOrdner.setUnterordner(Name: string; var UO: TOrdner);
begin
     if self.Unterordner=nil then setlength(self.Unterordner,1)
     else setlength(self.Unterordner,length(self.Unterordner)+1);

     Unterordner[length(self.Unterordner)-1]:=TOrdner.Create(Name);
     UO:=Unterordner[length(self.Unterordner)-1];
end;

procedure TOrdner.setDateien();
begin

end;

procedure TOrdner.setName(Name: string);
begin
     self.Name:=Name;
end;

//--- public - Prozeduren - TOrdner ---//

constructor TOrdner.Create(AName: String); //override;
begin
     //inherited Create;
     self.setName(AName);
end;

procedure TOrdner.getUnterordner(var UO: TOrdner);
begin
     UO:=self.Unterordner[length(self.Unterordner)-1];
end;

procedure TOrdner.getDateien();
begin

end;

procedure TOrdner.getName();
begin

end;

//--------------------------------------//


procedure Verzeichnis_einlesen(Verzeichnis: String; Struktur: TOrdner; var Ordner: TOrdner);
var
   SR: TSearchRec; //zur Dateisuche uses SysUtils
   UO: TOrdner;
begin
  
  if (Verzeichnis[length(Verzeichnis)]<>'\') then Verzeichnis:=Verzeichnis+'\'; //falls Verzeichnis nicht mit "\" endet

  Struktur:=TOrdner.create(Verzeichnis);

  if FindFirst(Verzeichnis+'*.*',faanyfile,SR)=0 then
     begin
          repeat
               if ((SR.Attr and faDirectory)>0) and (SR.Name<>'.') and (SR.Name<>'..') then
                   begin

                        Struktur.setUnterordner(Verzeichnis+SR.Name, UO);

  {--- REKURSION ---}   Verzeichnis_einlesen(Verzeichnis+SR.Name, UO);
                   end;

          until FindNext(SR)<>0; //solange Verzeichnisse gefunden werden
          FindClose(SR); //Suche beenden

     end;

     end;


end.




Mein Problem ist im Moment also, wie ich dann korrekt den Unterordner zum einen mit seinem Vater verknüpfe und zum anderen diesen wieder korrekt rekursiv durchsuche. Und wie ich hinterher auf die Ganze Struktur korrekt zugreifen kann.
Die Dateien der Ordner auszulesen soll noch nicht das Problem sein.


Danke schon mal!
Einloggen, um Attachments anzusehen!
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 18.07.09 09:36 
Also ich fände es eigentlich (aus meiner momentanenen Sicht heraus) angebrachter, wenn Du bei jedem Ordner - genauso wie bei den Dateien - den Mutter-Ordner - statt den Unterordnern - angibst.
Und beim Laufwerk lässt Du dann einfach den Mutterordner leer...
- Oder meinst Du, dass dann bei einem Zugriff auf ein bestimmtes Verzeichnis die Suche nach den untergeordneten Elementen zu lange dauert?

Also ich hätte das dann demnach so gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Type TDatei=class
      Name:String
      OberOrdner:TOrdner;
     end;
type TOrdner = class    
      Name: String;
      OberOrdner: TOrdner;
     end;


Wobei ich mich aber leider immer noch nicht so gut im Entwerfen eigener Klassen auskenne!
- Aber so kann es halt (je nach Ordner-/Datei-Menge insgesammt) ganz schön lange dauern, bis ein Ordner-Inhalt komplett angezeigt werden kann...
Bofrost_Mann Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
Delphi 5, Delphi 2005
BeitragVerfasst: Sa 18.07.09 10:17 
Hallo ffgorcky,

Danke für die Idee, aber je mehr ich darüber nachdenke, desto weniger halte ich diese Lösung für sinnvoll, eben auch aus deinen angeführten Punkten. - Für meine Zwecke ist es nützlicher, die Ordner "von oben herab" zu durchlaufen.

Nachdem ich darüber geschlafen habe, weiß ich nun auch schonmal, dass ich das Verzeichnis_einlesen wie folgt ändern muss:

ausblenden Delphi-Quelltext
1:
function Verzeichnis_einlesen(Verzeichnis: String; Struktur: TOrdner): TOrdner;					


wobei ich mir nicht ganz sicher bin, ob der Parameter Struktur: TOrdner überhaupt sinnvoll ist?


Wäre für weitere Tipps dankbar.