Nochmal - Ordner-/Dateienhirachie mit Flash und Zinc

heino-th

Erfahrenes Mitglied
Hi,
ich hatte mein Problem ja hier bereits einmal angesprochen und dann habe ich erst bemerkt
das es doch eine entsprechende Funktion für eine
Explorer-Mäsige Übersicht mitHilfe von Zinc gibt.

Nun aber gibt es keine spezielle Funktion dafür, also musste ich selbst Hand anlegen, was mir auch zu meiner fast zufriedenheit gelungen ist.
Mein Anliegen:
Ich möchte alle Dateien und Ordnerin einer Hirachischen Anordnung ausdrucken, also benötige ich eine Liste in etwa der Form:
- Laufwerk
..-Ordner
...-Datei
...-Datei
..-Ordner
...-Ordner
....-Datei
...-Datei
..-Datei
..-Datei
.usw....
so, das ist mir auch gelungen, alles wie gewollt, nur ein großes Problem hab ich mit meiner Lösung.
So sieht meine bisherige Lösung aus:
PHP:
function makeFileHistory(hPfad) {
	fileList.html = true;
	hFileList = mdm.FileSystem.getFileList(hPfad,"*.*");
	hFolderList = mdm.FileSystem.getFolderList(hPfad);
	for(var a=0;a<hFolderList.length;a++) {
		aktFileList = mdm.FileSystem.getFileList(hPfad+hFolderList[a],"*.*");
		aktFolderList = mdm.FileSystem.getFolderList(hPfad+hFolderList[a]);
		fileList.htmlText += "<b>Ordner: </b>"+hPfad+hFolderList[a]+"\n";
		for(var d=0;d<aktFolderList.length;d++) {
			fileList.htmlText += "   <b>Ordner: </b>"+hPfad+hFolderList[a]+"\\"+aktFolderList[d];
		}
		for(var b=0;b<aktFileList.length;b++) {
			fileList.htmlText += "   <b>Datei: </b>"+hPfad+hFolderList[a]+"\\"+aktFileList[b];
		}
	}
	for(var c=0;c<hFileList.length;c++) {
		fileList.htmlText += "<b>Datei: </b>"+hPfad+hFileList[ c]+"\n";
	}
}
makeFileHistory("D:\\");

Das gibt mir dann eine Liste aus, welche durch kleine Einrückungen(Leerzeichen) verdeutlicht welche Dateien/Ordner zu welchem ÜberOrdner gehören.
So, mein eigentliches Problem ist nun, das ich für jede Ebene die ich auslesen möchte, wieder ein paar Zeilen hinzuschreiben müsste, und was ich bisjetz so alles gecodet hab, hab ich meistens hier im Forum auch schon kürzer zusammengefasst gefunden :D
Also denke ich das das auch hier so sein wird ...
Würde mir ne Menge Arbeit erspaaren wenn mir hier jemand einen Denkanstoß zur Verkürzung des Skriptes geben könnte, damit ich so alle Ebenen auslesen kann.

Aja, noch dazu, da hier ja alles aufeinmal ausgelesen wird, steigt die CPU-Auslastung während die Ebenen abgeklappert werden auf 100% und HDD auch ziemlich hoch.
Vll kennt hier ja jemand noch ne bessere Lösung :)

Danke schonmal, hoffe ich habe mich verständlich ausgedrückt.

Mfg heino

/edit: Ach ja, die Befehle die mit mdm.FileSystem.usw. beginnen stammen aus Zinc und geben ein Array mit den im Ordner enthaltenen Dateien bzw Ordnern zurück.
 
Hi,

die Lösung wäre eine rekursive Funktion, hier mal aus Zeitgründen (und weil ich nichts über den Aufbau des von Zinc zurückgegebenen Arrays weiß) nur im Pseudocode:
Code:
function plotFileList(list, depth) {
    for (var i in list) {
        if (is_dir(list[i])) {
            tabstr = "";
            for (var h=0; h<depth; h++) {
                tabstr += "  ";
            }
            textfeld.text += tabstr + list[i] + " [DIR]";
            plotFileList(list[i], depth + 1); // rekursiver Aufruf
        } else {
            tabstr = "";
            for (var h=0; h<depth; h++) {
                tabstr += "  ";
            }
            textfeld.text += tabstr + list[i];
        }
    }
}

Gruß
.
 
hm, denke das das schon richtig sein könnte, aber irgendwie steig ich da grad net so durch ^^
Kannst du mir das vll etwas genauer erklären? ^^

Wäre dir sehr Dankbar!
Danke schonmal
mfg heino
 
Hmm, ich probiers nochmal etwas ausführlicher und kommentiert:
Code:
function plotFileList(dir, depth) { "dir" ist hier erstmal Pfad, der Dateien und Ordner enthalten kann; "depth" die aktuelle Tiefe: Beim Erstaufruf sollte 0 übergeben werden.
    var list = getDirList(dir); Anhand des Pfadnamens holen wir uns ein Array, dass alle Ordner und Dateien an diesem Ort enthält
    for (var i in list) { Wir gehen dann alles im Array durch:
        if (is_dir(list[i])) { Verwende ich hier wie die php-Funktion "is_dir": Es sollte getestet werden, ob der aktuelle Eintrag ein Ordner ist. Wenn ja ...
            tabstr = ""; ... geben wir den Ordnernamen erstmal aus. Dazu werden "depth" doppelte Leerzeichen (bei depth=5 also 10) zwecks Einrückung vorangestellt
            for (var h=0; h<depth; h++) {
                tabstr += "  ";
            }
            plotFileList(list[i], depth + 1); Dann rufen wir die Funktion "plotFileList" wieder auf, diesmal mit dem aktuellen Eintrag. die Variable "depth" erhöhen wir um 1, so dass der Inhalt des Ordners weiter eingerückt erscheint. So werden zuerst alle Ordner mit Inhalt Baumartig aufgelistet
        } else { ... wenn es dagegen eine Datei ist:
            tabstr = "";  ... geben wir den Dateinamen einfach (wie oben) eingerückt aus.
            for (var h=0; h<depth; h++) {
                tabstr += "  ";
            }
            textfeld.text += tabstr + list[i];
        }
    }
}

Wenn was unklar ist, benenne bitte die betreffende Stelle.

Gruß
.
 
Gut, danke für die Erklärung, werd mir das ganze dann mal heute zu Gemüte führen und gucken was draus wird ;)
Werd mich dann nochma melden

Danke :D

mfg heino
 
Zurück