Directory() nur Verzeichnisse finden

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Directory() nur Verzeichnisse finden

Beitragvon Manfred » So, 18. Dez 2016 20:41

mir brummt der Schädel, deshalb stelle ich euch jetzt mal die Frage:
ich möchte gerne rekursiv ein komplettes Laufwerk durchsuchen, mir aber nur erstmal die Verzeichnisse einfangen. Wie kann man das bewerkstelligen, das NUR Verzeichnisse ermittelt werden? Ich habe jetzt immer Dateien mit dabei. Wie kann man die ausklammern? Oder von mir aus auch, wie erkenne ich, ob es Dateien sind? Gibt es da ein Merkmal, das zurückgeliefert wird bei Directory()? Wenn ich das erkennen kann, kann ich darauf ja achten. Aber im Moment renne ich absolut im Kreis wie ein Köter, der sich selbst beissen will.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16095
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Directory() nur Verzeichnisse finden

Beitragvon Martin Altmann » So, 18. Dez 2016 21:00

:?: Schau Dir doch mal die Hilfe dazu an:
Code: Alles auswählen
aAlle := Directory( datenpfad + "\*", "D" )

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 12850
Registriert: Fr, 23. Sep 2005 3:58
Wohnort: Berlin

Re: Directory() nur Verzeichnisse finden

Beitragvon AUGE_OHR » So, 18. Dez 2016 23:31

Martin Altmann hat geschrieben::?: Schau Dir doch mal die Hilfe dazu an:
Code: Alles auswählen
aAlle := Directory( datenpfad + "\*", "D" )
also mit
Code: Alles auswählen
PROCEDURE MAIN
LOCAL datenpfad := "C:"
LOCAL aAlle := Directory( datenpfad + "\*", "D" )
LOCAL i,iMax

   iMax := LEN(aAlle)
   FOR i := 1 TO iMax
      ? aAlle[i][1]
   NEXT
   WAIT
RETURN
gibt er mir auch Datei aus und nicht "nur" die Verzeichnisse.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10207
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Directory() nur Verzeichnisse finden

Beitragvon AUGE_OHR » So, 18. Dez 2016 23:41

Manfred hat geschrieben: Wie kann man die ausklammern? Oder von mir aus auch, wie erkenne ich, ob es Dateien sind? Gibt es da ein Merkmal, das zurückgeliefert wird bei Directory()?
wenn du ein "D" bei Directory() angibst dann werden auch(!) Verzeichnisse berücksichtigt.
Verzeichnisse haben nun das Attribut "D" aber man muss auf
Code: Alles auswählen
IF "D" $ aDir[i][F_ATTR]
denn es könnte ja auch "DHS" sein.

... und wenn du alle Verzeichnisse hast was dann ? Anzeige als ... ?
wenn du jeweils nur 1 Verzeichniss jeweils benötigst dann schau dir mal das Demo \_JHV2016\2\1\LBDIR.PRG an.
das war die Geschichte wo man "intern" eine XbpListbox() "füllen" konnte mit einer API Funktion.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10207
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Directory() nur Verzeichnisse finden

Beitragvon Martin Altmann » Mo, 19. Dez 2016 3:52

Hmm. Ich habe bei mir als Platzhalter *. angegeben und das funktioniert.
Den . hatte ich hier entfernt, falls Manfred Verzeichnisnamen mit einem . drin hat. Danke für den Hinweis, da muss ich dann wohl bei mir was ändern, schließlich gibt es auch Dateinamen ohne Endung, die er dann als Verzeichnis interpretieren würde.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 12850
Registriert: Fr, 23. Sep 2005 3:58
Wohnort: Berlin

Re: Directory() nur Verzeichnisse finden

Beitragvon Manfred » Mo, 19. Dez 2016 8:34

OK,
es geht in der Hauptsache darum, dass ich erstmal ein Laufwerk komplett durchlaufen möchte um festzustellen, welche Verzeichnisse mit Unterverzeichnissen es gibt. Wenn ich alle Verzeichnisnamen ermittelt habe, dann möchte ich mit dem Ergebnis alle Verzeichnisse durchsuchen nach Dateien. Ist das zu kompliziert gedacht? Hat jemand eine einfacherere Lösung? Mir fällt nichts anderes ein. Wobei, wie Martin schon erwähnt hat, mir gestern auch aufgefallen ist, dass es nicht nur x.3, sonder x und x.x Dateiformate gibt. Also mit SubStr(name,-4,1) = "." war das ein Schuß in den ofen, wie ich klarerweise feststellen mußte. :roll:
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16095
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Directory() nur Verzeichnisse finden

Beitragvon Martin Altmann » Mo, 19. Dez 2016 10:00

Manfred,
Rekursion ist das Zauberwort ;-)
Schreibe eine Funktion, die alle Einträge in einem Verzeichnisse ermittelt und als Array zurückgibt. Vor dem Zurückgeben loopst Du noch über die Einträge - für jeden Eintrag, der in dem F_ATTR ein "D" enthält, rugst Du Deine Funktion erneut auf (dann natürlich mit diesem Eintrag als Parameter - kompletten Pfad vorne ran!)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 12850
Registriert: Fr, 23. Sep 2005 3:58
Wohnort: Berlin

Re: Directory() nur Verzeichnisse finden

Beitragvon Manfred » Mo, 19. Dez 2016 10:02

Hi martin,
so mache ich das ja auch, aber es kam zeitweise Murks dabei heraus. Mal fehlte was, dann waren wieder Dateien drin. Und es ist sehr schwer bei über 1000 Verzeichnissen das zu verifizieren, ob es vom Ergebnis her stimmen kann.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16095
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Directory() nur Verzeichnisse finden

Beitragvon Jan » Mo, 19. Dez 2016 10:12

Ich muß gestehen, das ich da so meine Probleme mit habe. Wenn ich als zweiten parameter ein "D" angebe, bekomme ich nach einem kurzen test nur die Verzeichnisse in das Array geschrieben. Und selbst wenn da noch Dateien bei sein sollten: Der 5. Eintrag in jedem Arraysatz gibt an, ob das ein Verzeichnis ist (z. B. "D", oder "AD"). Das kann man doch locker abarbeiten.

Allerdings habe ich das mit der 2.0 getest.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
 
Beiträge: 11624
Registriert: Fr, 23. Sep 2005 17:23
Wohnort: 49328 Melle

Re: Directory() nur Verzeichnisse finden

Beitragvon Manfred » Mo, 19. Dez 2016 10:36

richtig, ich will ja erstmal nur die verzeichnisse haben. Und zwar alle. Dann durchforste ich das Ergebnis nochmal um mir die Dateien anzeigen zu lassen. Anders wüßte ich auch keine Lösung.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16095
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Directory() nur Verzeichnisse finden

Beitragvon Manfred » Mo, 19. Dez 2016 11:39

ich glaube ich habe das Problem entdeckt. Ich habe zuerst mit dem TotalCommander das Laufwerk durchsuchen lassen und ein Ergebnis erhalten, was sich mit meinem nicht deckte. Dann habe ich mir aber die Parameter vom TC angesehen und da waren auch Archive mit bei. Das habe ich erstmal deaktiviert und was die Verzeichnisse angeht, ist es jetzt gleich. OK, also nächster Schritt.
Also der Hinweis von Jimmy war erstmal Gold wert. Das hatte ich zwar irgendwie gesucht in der Anleitung, aber nicht gefunden.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16095
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Directory() nur Verzeichnisse finden

Beitragvon Werner_Bayern » Mo, 19. Dez 2016 12:33

Servus Manfred,

dazu gabs mal eine Funktion GetAllFiles, kann aber weder bei Alaska noch hier im Forum den Quelltext dazu finden. Hab mir den individuell angepasst.

Musst rekursiv suchen, bei mir funktioniert das so:

Code: Alles auswählen
aFiles := Directory(cFolderName, "DSH")

und bei der Suche dann:
Code: Alles auswählen
if "D" $ aFiles[dwN, F_ATTR] .and. .not. aFiles[dwN, F_NAME][1] == "."
es grüßt euch

Werner
Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1215
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Directory() nur Verzeichnisse finden

Beitragvon HaPe » Mo, 19. Dez 2016 13:58

Hallo Zusammen !

Von wOOdy gibst dazu den folgenden (VFP-)Code:
Code: Alles auswählen
******************************************************************************
* Program....: DirList.prg
* Version....: 1.0
* Author.....: Jürgen Wondzinski
* Date.......: 18.September 1999
* Notice.....: Copyright (c) 1999 ProLib Software GmbH, All Rights Reserved.
* Compiler...: Visual FoxPro 06.00.8492.00 für Windows
* Abstract...: Diese Routine liest ein beliebiges Verzeichnis
*            : samt allen Unterverzeichnissen in eine Datei ein.
*******************************************************************************
SET TALK OFF
SET DATE GERMAN
SET CENTURY ON
SET SECONDS ON
SET STRICTDATE TO 0
SET HOURS TO 24
SET SAFETY OFF
CLOSE DATA ALL

cPfad = "c:\windows"  && hier Laufwerk/Pfad eintragen

CREATE TABLE (m.cPfad+"\Dateien")( NAME C (128), SIZE N (10), TIMESTAMP T, ATTRIB C (5), PATH C (128) )

* Das ist der eigentliche Aufruf:
Treewalk(m.cPfad)

* Ergebnis anzeigen
BROWSE

RETURN

*******************************************************************
FUNCTION Treewalk (cPfad)
* Des Pudels Kern: Ein rekursiver Aufruf
*******************************************************************
LOCAL nAnzahl, i, Arr(1)

* Dateien einlesen
nAnzahl = ADIR(Arr, m.cPfad+"\*.*", "D")
ASORT(Arr)

WAIT WINDOW m.cPfad + ": " + TRANS(nAnzahl) NOWAIT

* und wegschreiben
FOR i = 1 TO m.nAnzahl
   IF NOT "D" $ Arr(i,5)
      INSERT INTO Dateien (NAME, SIZE, TIMESTAMP, ATTRIB, PATH) VALUES ( Arr(i,1), Arr(i,2),;
         CTOT(DTOC(Arr(i,3))+" "+ Arr(i,4)), Arr(i,5), m.cPfad)
   ENDIF
ENDFOR

* Directories abarbeiten
FOR i = 1 TO m.nAnzahl
   IF "D" $ Arr(i,5) AND Arr(i,1) # "."
      ** Eins tiefer per Rekursion
      Treewalk(m.cPfad + "\" + Arr(i,1))
   ENDIF
ENDFOR

RETURN
--
Hans-Peter
Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 149
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Directory() nur Verzeichnisse finden

Beitragvon AUGE_OHR » Mo, 19. Dez 2016 18:04

hi,

für DOS habe ich ein Programm das sich SWEEP.COM nennt was ich früher benutzt habe um *.BAK rekursive zu löschen.
das geht nun jetzt mit Xbase++ bei mir so
Code: Alles auswählen
PROCEDURE RECUDIRS( cPath, cWildcard, bblock )
   ...
      aDIR := DIRECTORY( cPath + "*.*", "DH" )
      nLEN := LEN( aDIR )
      FOR nCount := 1 TO nLEN
         IF "D" $ aDIR[ nCount, F_ATTR ] .AND. .NOT. ;
                ( aDIR[ nCount, F_NAME ] = "." .OR. ;
                  aDIR[ nCount, F_NAME ] = ".." )

            RECUDIRS( cPath + aDIR[ nCount, F_NAME ] + "\", cWildcard, bblock )
         ELSE
            EVAL( bblock, cPath, aDIR[ nCount, F_NAME ] )
         ENDIF
      NEXT
   ...   
RETURN
der bblock sieht z.b. so aus.
Code: Alles auswählen
{|x,y| DO3WORK( x, y ) }

PROCEDURE DO3WORK( cPath, cFile )
  ...
  IF Bedingung
    AADD(aAlle,  cPath+cFile )
  ENDIF
RETURN
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10207
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast