Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterordner in Array speichern (https://www.delphipraxis.net/139829-unterordner-array-speichern.html)

delphi-n 6. Sep 2009 13:01


Unterordner in Array speichern
 
Hi!

Ich bin neu hier, und habe eine Frage. Ich hab schon gesucht, aber nichts brauchbares gefunden.

Mein Problem ist dies:

Ich möchte aus einem Ordner alle Unterordner in einem Array speichern.

Also Ordnername1 in arrayname[1];
Ordnernae2 in arrayname[2]...


wie mache ich das am besten?


Vielen Dank,

der delphi-n ;)

mkinzler 6. Sep 2009 13:05

Re: Unterordner in Array speichern
 
Mit was hast du Probleme, der Ermittlung der Ordner?

DeddyH 6. Sep 2009 13:05

Re: Unterordner in Array speichern
 
Hallo und Willkommen in der DP :dp:,

mit dem Gespann FindFirst, FindNext kannst Du durch den Ordner iterieren. Um festzustellen, ob es sich bei dem aktuellen Eintrag um ein Verzeichnis handelt, kannst Du die Attribute von TSearchRec auf faDirectory untersuchen. Als Beispiel für so etwas kannst Du einmal nach Hier im Forum suchenFindAllFiles suchen.

delphi-n 6. Sep 2009 13:07

Re: Unterordner in Array speichern
 
wie macht man das genau? ( sry, ich hatte vergessen zu erwähnen, dass ich weder weiß, wie viele unterordner es gibt, noch wie sie heißen)

mkinzler 6. Sep 2009 13:08

Re: Unterordner in Array speichern
 
Dann bietet sich ein dynamischer Array an.

DeddyH 6. Sep 2009 13:09

Re: Unterordner in Array speichern
 
Oder eine Ableitung von TStrings (TStringlist z.B.).

delphi-n 6. Sep 2009 16:17

Re: Unterordner in Array speichern
 
das Problem liegt ja darin, dass ich nicht weiß, wie die ordner heißen.

Also soll z.B. geschaut werden, ob Ordner xy im verzeichnis z, auch im verzeichnis w zu finden ist.

Allerdings kann ich nicht schreiben "schaue nach ob xy in w vorhanden ist", da ich weder weiß, ob xy auch wirklich xy heißt, noch ob es wirklich existiert.

Und dann muss das natürlich mit einer (unbekannten) Anzahl an ordnern wiederholt werden. (wieder mit unbekannten namen).

mkinzler 6. Sep 2009 16:18

Re: Unterordner in Array speichern
 
Deren Namen kannst du ja mit FindFirst/FindNext ermitteln

DeddyH 6. Sep 2009 16:19

Re: Unterordner in Array speichern
 
Soll das eine Art Ordnersynchronisation werden?

delphi-n 6. Sep 2009 17:22

Re: Unterordner in Array speichern
 
Zitat:

Soll das eine Art Ordnersynchronisation werden?
ja, sowas in der art


Zitat:

Deren Namen kannst du ja mit FindFirst/FindNext ermitteln
wie macht man das genau? (auch auf dieses Beispiel bezogen)


[edit]: ich hab das gefunden:
http://www.delphipraxis.net/internal...=392510#392510

wie wende ich das nun auf mein Beispiel an?

Irgendwie bakommeich die procedure nicht aufgerufen. Was muss ich da reinschreiben?

ich hab schon
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var OL: array[1..99] of string;
begin
findallfiles(OL; 'C:\Programme' ;
end;
aber das will der nicht


habt ihr eine idee?

DeddyH 6. Sep 2009 18:04

Re: Unterordner in Array speichern
 
Lass das Array mal weg und nimm stattdessen TStrings. Dann ginge das ungefähr so (aus dem Kopf getippt, daher ungetestet):
Delphi-Quellcode:
procedure GetDirectories(DirName: string; const sl: TStrings);
var Rec: TSearchRec;
begin
  sl.Clear;
  DirName := IncludeTrailingPathDelimiter(DirName);
  if FindFirst(DirName + '*.*', faDirectory, Rec) = 0 then
    try
      repeat
        if (Rec.Name <> '.') and (Rec.Name <> '..') and ((Rec.Attr and faDirectory) = faDirectory) then
          sl.Add(Rec.Name);
      until FindNext(Rec) <> 0;
    finally
      SysUtils.FindClose(Rec);
    end;
end;

delphi-n 7. Sep 2009 13:53

Re: Unterordner in Array speichern
 
also ich hab jetzt das von oben eingegeben, aber bei


sl.Clear;


kommt der Fehler

"Zugriffsverletzung bei Adresse 00454C9A in Modul 'Projektname.exe'. Lesen von Adresse 00000000"


Woran kann das liegen?

himitsu 7. Sep 2009 14:00

Re: Unterordner in Array speichern
 
spontan geraten (und das wurde auch hier überall im Forum schon oft gesagt)

du muß die nötige StringList (TStrings/TStringList) vorher auch SELBER erstellen!

delphi-n 7. Sep 2009 14:06

Re: Unterordner in Array speichern
 
das hab ich oben in der var stehen:

Delphi-Quellcode:
OL: Tstrings;

und unten dann:

Delphi-Quellcode:
GetDirectories(Edit1.Text, OL);
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 7. Sep 2009 14:07

Re: Unterordner in Array speichern
 
Und zwar mit
Delphi-Quellcode:
  OL := TStringList.Create;

delphi-n 7. Sep 2009 14:12

Re: Unterordner in Array speichern
 
da kommt "listenindex überschreitet das max...bla"
mich wundert aber, dass ich gar kein max eingegeben habe??

sry, wenn das vlt. etwas doof klingt, aber wie erstellt man das "maximum"?

DeddyH 7. Sep 2009 14:16

Re: Unterordner in Array speichern
 
Du kannst das Maximum nicht "erstellen", das richtet sich nach der Anzahl der Einträge. Vermutlich hast Du eine For-Schleife, in der Du bis Liste.Count statt Liste.Count - 1 durchläufst.

delphi-n 7. Sep 2009 14:19

Re: Unterordner in Array speichern
 
nein, mein fehler liegt woanders:

der soll wie gesagt die ordner finden. Nun hab ich dem ein Verz. ohne Ordner gegeben. :wall:

Da muss nat. voher ne abfrage rein, oder mit try und except.

himitsu 7. Sep 2009 14:21

Re: Unterordner in Array speichern
 
Zitat:

Zitat von mkinzler
Und zwar mit
Delphi-Quellcode:
  OL := TStringList.Create;

und nicht vergessen diese nachher mit OL.Free; wieder freizugeben ... also alles so wie man es von einer objektorientierten Programmierung her kennt :)

DeddyH 7. Sep 2009 14:28

Re: Unterordner in Array speichern
 
Zitat:

Zitat von delphi-n
nein, mein fehler liegt woanders:

der soll wie gesagt die ordner finden. Nun hab ich dem ein Verz. ohne Ordner gegeben. :wall:

Da muss nat. voher ne abfrage rein, oder mit try und except.

Du kannst doch vor dem Aufruf der Prozedur gar nicht wissen, ob Ordner enthalten sind. Eine Überprüfung kann also nur im Anschluss erfolgen.

delphi-n 7. Sep 2009 17:26

Re: Unterordner in Array speichern
 
wieso klappt eig.

Delphi-Quellcode:
procedure GetDirectories(DirName: string; const sl: TStrings);
var Rec: TSearchRec;
begin
  sl.Clear;
  DirName := IncludeTrailingPathDelimiter(DirName);
  if FindFirst(DirName + '*.*', faDirectory, Rec) = 0 then
    try
      repeat
        if (Rec.Name <> '.') and (Rec.Name <> '..') and ((Rec.Attr and faDirectory) = faDirectory) then
          sl.Add(Rec.Name);
      until FindNext(Rec) <> 0;
    except  //(statt finally)
      ShowMessage('Kein Ordner gefunden');
      SysUtils.FindClose(Rec);
    end;
end;
nicht?

himitsu 7. Sep 2009 17:36

Re: Unterordner in Array speichern
 
was heißt "wieso klappt eig. nicht"?

WAS GEHT NICHT und WELCHE FEHLERMELDUNGEN werden angezeigt.

delphi-n 7. Sep 2009 17:51

Re: Unterordner in Array speichern
 
Zitat:

da kommt "listenindex überschreitet das max...bla"
mich wundert aber, dass ich gar kein max eingegeben habe??

sry, wenn das vlt. etwas doof klingt, aber wie erstellt man das "maximum"?
nun ja, der fehler, dass in einem Ordner keine Unterordner sind.

Da dachte ich, könnte man das mit except abfangen; aber es ist alles wie voher (mit finally).

rollstuhlfahrer 7. Sep 2009 19:09

Re: Unterordner in Array speichern
 
HI,

also bei mir ist dem FindFirst/FindNext-Gespann eigentlich völlig egal, ob es irgendwelche Unterordner/Dateien gibt. Aber dass es dabei zu Fehlermeldungen kommt, ist mir neu. Und ob du nun Ordner hast oder nicht, weist du erst nachdem du Windows gefragt hast, ob es irgendwelche Ordner für dich parat hat. Das Ergebnis siehst du dann daran, dass am Ende in deiner Liste was drin ist.

Bernhard

PS: Sollen die Unterordner auch noch rekursiv dargestellt werden?

delphi-n 7. Sep 2009 19:14

Re: Unterordner in Array speichern
 
Zitat:

PS: Sollen die Unterordner auch noch rekursiv dargestellt werden?
ja, aber das hab ich schon mit einer listbox erledigt.

aber wenn wir schon dabei sind, wie ermittelt man die länge dieser ListBox, bzw. wie viele einträge sie hat?

rollstuhlfahrer 7. Sep 2009 19:16

Re: Unterordner in Array speichern
 
HI,

die Anzahl der Elememte einer Listbox gibts mit ListBox1.Items.Count!

Zitat:

Zitat von delphi-n
ja, aber das hab ich schon mit einer listbox erledigt.

Kannst du mir mal zeige, wie das dann aussieht. Kann mir das irgendwie nicht vorstellen.

Bernhard

delphi-n 7. Sep 2009 19:19

Re: Unterordner in Array speichern
 
Delphi-Quellcode:
ListBox1.Items.AddStrings(OL);
OL ist ein TString und dorthin hab ich voher die Ordner ausgelesen (s.o.)

rollstuhlfahrer 7. Sep 2009 19:37

Re: Unterordner in Array speichern
 
oups, zu schnell. Kann gelöscht werden

Bernhard

DeddyH 8. Sep 2009 08:08

Re: Unterordner in Array speichern
 
Dann zeig doch mal Deinen kompletten Code. Dass ein Ordner keine Unterordner enthält kann man btw. ja schlecht als Fehler ansehen, von daher ist das except IMHO sinnbefreit.

mkinzler 8. Sep 2009 08:15

Re: Unterordner in Array speichern
 
Rekursiv gesehen stösst man ja immer auf diesen Sachverhalt

DeddyH 8. Sep 2009 08:16

Re: Unterordner in Array speichern
 
Jepp, irgendwann ist Schluss.

delphi-n 8. Sep 2009 16:27

Re: Unterordner in Array speichern
 
seltsam: wenn ich das auf meinem Rechner daheim ausführe, klappt alles wie geschmiert. :roll:
Der andere war ein Rechner, bei dem fast alles gesperrt und auf nem Server gespeichert ist.

Aber egal, hauptsache es klappt :thumb:

rollstuhlfahrer 8. Sep 2009 16:58

Re: Unterordner in Array speichern
 
Zitat:

Zitat von delphi-n
Der andere war ein Rechner, bei dem fast alles gesperrt und auf nem Server gespeichert ist.

Solange es sich um einen Windows-Rechner handelt, sollte das eigentlich kein Problem darstellen. In der Schule ist die C:-Partifion auch im Explorer unsichtbar. Mit FindFirst/-Next kann man aber trotzdem zugreifen, da die Daten ja vorhanden sind und auch das BS die irgendwoher nehmen muss. Wenn du das auf einem Netzwerklaufwerk ausprobierst, solltes du das Netzlaufwerk vorher mit dem Explorer aktualisieren, damit auch ja die Verbindung existiert. Ansonsten sehe ich eigentlich nicht ein Problem, dass FindFirst/-Next irgendwelche Fehler produzieren soll/darf. Ich schätze mal, dass die Windows-interne Dateisuche auch darauf aufbaut (wenn man nicht gerade den Indexdienst nimmt).

Bernhard

PS:
Zitat:

Zitat von delphi-n
Aber egal, hauptsache es klappt :thumb:

Dann bin ich ja beruhigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz