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

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Directory() nur Verzeichnisse finden

Beitrag von Manfred »

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 Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Directory() nur Verzeichnisse finden

Beitrag von Martin Altmann »

:?: 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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von AUGE_OHR »

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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von AUGE_OHR »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Directory() nur Verzeichnisse finden

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von Manfred »

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 Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Directory() nur Verzeichnisse finden

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von Manfred »

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 Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Directory() nur Verzeichnisse finden

Beitrag von Jan »

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
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von Manfred »

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 Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von Manfred »

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 Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von Werner_Bayern »

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

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von HaPe »

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
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Directory() nur Verzeichnisse finden

Beitrag von AUGE_OHR »

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
Antworten