Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#5

Re: Unterordner und deren unterordner

  Alt 31. Okt 2009, 23:43
Matze meinte ja ich solle mein "Wissen" teilen

ohne Recursion würde es z.B. auch so gehn

- ein Verzeichnis kann maximal MAX_PATH lang sein
(inklusive abschließender PChar-#0 und der Laufwerkskennung)
- macht also 255 Zeichen für den Pfad
- ein Pfad kann mindestens 1 Zeichen lang sein
- macht sozusagen 255/2 = maximal 127 Verzeichnisebenen

bedeutet du müßtest 127 Leseschleifen verschachteln

Hier mal der gekürzte Code ... für die ersten 3 und die letzte Schleife
(die restlichen 123 Schleifen müßte man also NUR noch einfügen und durchnummerieren)
Delphi-Quellcode:
Procedure FindAllFilesWithoutRekursion(Dir: String; SL: TStrings);
  Var R1, R2, R3, R4, R5 ... R127: TSearchRec;
    D2, D3, D4, D5 ... D127: String;

  Begin
    Dir := IncludeTrailingPathDelimiter(Dir);
    If FindFirst(Dir + '*.*', R1) = 0 Then Begin
      Repeat
        If (R1.Name = '.') or (R1.Name = '..') Then Continue;
        If R1.Attr and faDirectory <> 0 Then Begin

          D2 := Dir + R1.Name + '\';
          If FindFirst(D2 + '*.*', R2) = 0 Then Begin
            Repeat
              If (R2.Name = '.') or (R2.Name = '..') Then Continue;
              If R2.Attr and faDirectory <> 0 Then Begin

                D3 := D2 + R2.Name + '\';
                If FindFirst(D3 + '*.*', R3) = 0 Then Begin
                  Repeat
                    If (R3.Name = '.') or (R3.Name = '..') Then Continue;
                    If R3.Attr and faDirectory <> 0 Then Begin

                      ...

                      D127 := D126 + R126.Name + '\';
                      If FindFirst(D127 + '*.*', R127) = 0 Then Begin
                        Repeat
                          If (R127.Name = '.') or (R127.Name = '..') Then Continue;
                          If R127.Attr and faDirectory <> 0 Then
                            Raise Exception.Create('zuviele Verzeichnisse gefunden');
                          Else SL.Add(D127 + R127.Name);
                        Until FindNext(R127) <> 0;
                        FindClose(R127);
                      End;

                      ...

                    End Else SL.Add(D3 + R3.Name);
                  Until FindNext(R3) <> 0;
                  FindClose(R3);
                End;

              End Else SL.Add(D2 + R2.Name);
            Until FindNext(R2) <> 0;
            FindClose(R2);
          End;

        End Else SL.Add(Dir + R1.Name);
      Until FindNext(R1) <> 0;
      FindClose(R1);
    End;
  End;
also ganz im Ernst ... lerne lieber das mit der Rekursion


PS: wenn man sich den Code so ansieht, dann kann man das ganze auch ganz schön via Interation lösen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat