Datei-Anzahl in einem Verzeichnis ermitteln

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von ejomi »

Hallo und einen schönen Morgen Experten!

Zuerst das mir Bekannte:
Über den Service "SimpleFileAccess" läßt sich mit der Methode "getFolderContents" wunderbar der Verzeichnisinhalt in einen Array einlesen. Die Größe des Arrays (UBound) gibt dann Auskunft über die Anzahl der Verzeichniseinträge.

Das Problem:
Je größer der Verzeichnisinhalt um so länger dauert das Einlesen mit "getFolderContents". Ab ca. 600 Einträgen wird die Lesezeit unerträglich und kann bei einigen 1000 Einträgen mehrere Minuten dauern. Offenbar analysiert "getFolderContents" auch die Datei-Inhalte: Befinden sich nämlich in dem betreffenden Verzeichnis sehr große Dateien (in meinem Fall sehr große, DBF-Datenbankdateien) schmiert OO sogar komplett ab!

Die "Dir()"-Funktion kann ich dazu nicht gebrauchen, weil ich eine Dateiliste incl. möglicher Unterordner erstelle und dazu einen rekursiven Aufruf der Foldercontent-Routine benutze. Die "Dir()"-Funktion läßt sich aber nur einmal aufrufen bzw. bezieht sich in den weiteren Durchläufen immer auf die letzte Pfad-Abfrage, was natürlich bei rekursiven Abläufen zu einem heillosen Durcheinander führt.

Die Frage:
Gibt es Methoden, um schnell und mit wenig Speicherlast die Anzahl von Dateien eines Verzeichnisses zu ermitteln? Ich könnte dann wenigstens eine mögliche Überlastung vorher abfangen, bevor ich mit "getFolderContents" eine Dateiliste erstelle.

Gruß: ejomi
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von komma4 »

Ich bin mir sicher, dass es eine Unzahl von Webseiten mit BASIC-Lösungen zur rekursiven Bearbeitung von Verzeichnisbäumen gibt.

Unter Linux würde ich (bei Zeitproblemen)

Code: Alles auswählen

find /verzeichnis -type f | wc -l
ausführen und das Ergebnis in eine Temp-Datei schreiben, diese dann auslesen.

Arbeitest Du mit Windows.... könntest Du diese Befehlskette auch mit dem cygwin Tool nutzen


Hilft das weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von ejomi »

Hallo komma4 - Danke erst mal für die schnelle Antwort.

komma4 hat geschrieben:Ich bin mir sicher, dass es eine Unzahl von Webseiten mit BASIC-Lösungen zur rekursiven Bearbeitung von Verzeichnisbäumen gibt.
... zum Einlesen eines Verzeichnissbaums gibt's in Dannis Lib schon seit langem eine ganz gute Prinziplösung:

Code: Alles auswählen

Function ReadDir(FileList(), z, sRootPath) As Integer
	' Thanks to Michael Dannenhoefer ( http://www.starbasicfaq.de/index.html)
	Dim i As Integer, sRootUrl As String, sCrntPath As String, oSfA As Object, aPathContent()
	
	sRootUrl = ConvertToUrl(sRootPath)
	oSfA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
	aPathContent = oSfA.getFolderContents(sRootUrl, True)

	For i = LBound(aPathContent) To UBound(aPathContent)
		sCrntPath = aPathContent(i)
		If oSfA.isFolder(sCrntPath) Then
			ReadDir(FileList(), z, sCrntPath)
		Else
			FileList(z) = sCrntPath
			z = z + 1
		EndIf
	Next i

	ReadDir = z

End Function
... problematisch dabei sind allerdings weit verschachtelte Unterverzeichnisse: wendet man Dannis Routine z.B. auf dem Rootverzeichnis des Systemlaufwerks an, erlebt man sein blaues Wunder!! Hier muß man eine "Bremse" einbauen, die zunächst nur 1 Ebene höher einliest sonst wird nämlich der Inhalt der gesamten Festplatte aufgelistet!

Ich möchte einfach nur mit einer kurzen Routine feststellen, wieviele Dateien sich im nächst höheren Verzeichnis befinden. Wie oben im meinem Thread schon beschrieben, führt die Methode über "getFolderContents" zu endlosen Wartezeiten, wenn der betreffende Ordner knall-voll ist (ab 1000 Dateien).
komma4 hat geschrieben:Arbeitest Du mit Windows.... könntest Du diese Befehlskette auch mit dem cygwin Tool nutzen
... mea maxima culpa: ich hätte natürlich direkt angeben sollen, daß ich unter WinXP arbeite - 'tschuldijung!
komma4 hat geschrieben:Hilft das weiter?
... nicht wirklich - ich hatte schon mal vor längerer Zeit mit Cygwin herumgespielt um eine KDE-Oberfläche unter Windows zu simulieren - ging nach leider hinten los. Da wir hier von zeitkritischen Prozessen reden, kann ich mir auch nicht vorstellen, daß eine via Cygwin um 3 Ecken simulierte Linux-Funktion wirklich schnell sein kann!

Aber Du hast mich auf eine Idee gebracht: Windows hat ja auch Millionen APIs - da muß es doch Entsprechendes geben. Wobei sich für mich aber direkt die nächste Frage auftut: Kennt Jemand auf Anhieb eine entsprechende Windows-API und wie startet man diese unter OO? Win-APIs habe ich bisher nur mit VBA benutzt.

Am coolsten wäre natürlich eine platform-unabhängige OO-Lösung - hat vielleicht noch Jemand eine Idee?

Gruß: ejomi
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von Karolus »

Hallo
ich hatte schon mal vor längerer Zeit mit Cygwin herumgespielt um eine KDE-Oberfläche unter Windows zu simulieren - ging nach leider hinten los
Natürlich geht das nicht - Cygwin ist eine Terminalemulation und keine VM.

Wenn du mal etwas genauer spezifizierst [warum- , welche-, in welcher Verzeichnistiefe etc.pp ] Dateien zählst(verarbeitest?) dann könnte man eine passende Lösung in Python stricken.

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von ejomi »

Hallo Karolus!
Karolus hat geschrieben:Wenn du mal etwas genauer spezifizierst [warum- , welche-, in welcher Verzeichnistiefe etc.pp ] Dateien zählst(verarbeitest?) dann könnte man eine passende Lösung in Python stricken.
... na, so wie ich es schon beschrieben hatte: Einfach nur die enthaltenen Einträge eines einzelnen Ordners (sozusagen eine "Teil-FAT") auflisten, wobei ich es eben hier mit teilweise extrem vielen Einträgen zu tun habe, die mit der Methode "SimpleFileAccess/getFolderContents" nur sehr langsam zu packen sind und manchmal OO sogar zum abschmieren bringen.

In meinem Fall geht es um mehrere, verschachtelte Verzeichnisse einer alten, sehr großen DBase-Datenbank mit unzähligen Index-Dateien. Von diesem Daten-Salat "mißbrauche" ich einige Datencontainer mittels OO-Base für andere Zwecke (Einzelheiten dazu würden hier zu weit führen).

Nun möchte ich für den Benutzer eine gefilterte Dateiauflistung von nur einigen Ordnern dieser DBase-Verzeichnisstruktur zur Verfügung stellen. Dazu will ich die Anzahl der enthaltenen Dateien vorher prüfen, den Ordner ggf. überspringen oder die Datenliste anhand von Dateinamen gefiltert zur Verfügung stellen. Die DBase Datenbank ist noch in Benutzung, d.h. es ändern sich täglich die Ordner-Inhalte. Aus diesem Grund ist eine "statische" Methode nicht möglich - ich muß tatsächlich die "echten" Ordner-Inhalte (d.h. die dort enthaltenen Dateinamen) auslesen und verarbeiten.

Hört sich kompliziert an - ist es auch. Das "Wieso" und "Warum" spielt aber hier keine Rolle: Es geht mir jetzt einfach nur darum, eine speicherschonende und schnelle Methode zu finden, unter OO eine Verzeichnis-Auflistung sehr großer Ordner-Inhalte aus einer Ebene zu realisieren - mehr nicht.

Ich hoffe, ich konnte mich verständlich ausdrücken?

Ach ja - Python: Hab' leider keine Erfahrung damit. Ich hatte mich mal kurz versucht in die Materie einzufizzen, konnte aber aus Zeitgründen das Thema nicht weiter vertiefen. Ich weiß aber zumindest, wie man Python-Scripte einbindet und ans laufen bekommt - mehr aber nicht.

Gruß: ejomi
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von komma4 »

ejomi hat geschrieben:kann ich mir auch nicht vorstellen, daß eine via Cygwin um 3 Ecken simulierte Linux-Funktion wirklich schnell sein kann!
Ich kann mir das gut vorstellen, dass es schneller als OOo-StarBasic ist!
Warum probierst Du es nicht aus? 5 Minuten Installationsaufwand und dann den Test gemacht
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von ejomi »

komma4 hat geschrieben:Warum probierst Du es nicht aus? 5 Minuten Installationsaufwand und dann den Test gemacht
Nochmals Danke, koma4!

... die Sache ist nur so: ich kann meinem Administrator nicht zumuten, wegen eines relativ seltenen Einzelproblems in unserer Firma von einer Arbeitsstation zur anderen zu hexen, um dort überall Cygwin zu installieren (Übrigens: Der Administrator bin ich :oops: ).

Kurz: Ich träume immernoch von einer unabhängigen, im Code verankerten "Rapid-Lösung".

By the way: Die Ursache für das Abschmieren von OO bei großen Datei-Listen, die ich mit der "getFolderContents-Methode" eingelesen hatte, war offenbar nur unsauberer Programmcode. Eine neu programmierte Testroutine mit gleicher Funktionalität läuft nun einwandfrei.

Aber das Problem bleibt: Um z.B. einen Ordnerinhalt mit ca. 11.000 Dateien nur programmintern einzulesen, benötig OOo bereits über 30 Sek. (wobei noch keine weitere Analyse oder Verarbeitung der Liste, geschweige Bildschirmdarstellung, erfolgt ist)!

Gruß: ejomi
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Re: Datei-Anzahl in einem Verzeichnis ermitteln

Beitrag von pmoegenb »

Hallo ejomi,
darf's auch eine fertige Lösung sein ? Wie z. B. den FreeCommander
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
Antworten