Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
aus den Files kannst du Verzeichnisse zur Zuordnung und Dateinamen zur Anzeige extrahieren,
oder möchtest du dynamisch ein Live-Bild der Festplatte a la Dateiexplorer bauen?
Genau da liegt mein Problem: ich weiss nicht wie ich die Verzeichnisse extrahieren soll, sodass ich einen Knoten daraus erstellen kann.
Ich habe folgendes in einem Beispiel-JTree-Browser gefunden:
Java:
public Object getChild(Object parent, int index) {
File directory = (File) parent;
String[] directoryMembers = directory.list();
return (new File(directory, directoryMembers[index]));
}
public int getChildCount(Object parent) {
File fileSystemMember = (File) parent;
if (fileSystemMember.isDirectory()) {
String[] directoryMembers = fileSystemMember.list();
return directoryMembers.length;
}
else {
return 0;
}
}
Wie muss ich denn hin- und herparsen, damit ich alle Member beispielsweise aus "c:\" herausfinde, wenn ich zB "c:\home\subn0de\Documents\foo.bar" habe, und
+-"c:\"
....+-/home
........ +-/subn0de
............ +-/Documents
................ +-/foo.bar
brauche?
oder möchtest du dynamisch ein Live-Bild der Festplatte a la Dateiexplorer bauen?
Es soll schon a la Dateiexplorer sein, nur eben kein Abbild der Festplatte sein, sondern aus einer Auswahl an Dateien bestehen, zB alle über 100MB, daher auch die Liste.
denke zunächst nicht an JTree, sondern an ein Konsolen-Programm,
baue eins mit Ausgabe
Root:
c:\
Kinder:
home
auswärts
netzwerk
Verzeichnis:
home
Kinder:
subn0de
SlaterB
andere liebe Besucher
Verzeichnis:
..
Kinder:
..
-------
dazu ist deine Aufgabe, die Liste der Dateien zu analysieren,
Verwende eine Map<String oder File, List<String oder File>>
arbeite die Liste der Files einen Eintrag nach dem anderen durch,
zu jedem File holst du dir den Pfad (in API nachschauen),
den Pfad trennst du nach Dateinamen/ Oberverzeichnis und fügst die Datei/ das File in die Liste in der Map zum Verzeichnis-String ein (Liste erstellen wenn noch nicht vorhanden)
das Verzeichnis kannst du auch noch nach allen '/' oder '\' einzeln aufteilen und jeweils das Unterverzeichnis in der Map dem Oberverzeichnis zuordnen,
ob du als Key in der Map nur den aktuellen Verzeichnis-Namen (z.B. home) oder den vollen Pfad (c:\home) oder das File-Objekt nimmst, bleibt die überlassen,
bedenke, ob es doppelte Verzeichnisse gibt,
c:\home
c:\x\y\home
Root-Verzeichnisse merhe dir gesondert, falls wichtig,
am Ende die Map auf verschiedene Weisen angehen, z.B. vom gemerkten Root-Key aus,
wenn du die Map einigermaßen kontrolliert ausgeben kannst, in der nächste Schritt dann Umwandlung in JTree
Vielen Dank für Deinen Tip. Vermutlich ist des Puzzles Lösung die Map, sie war mir nicht geläufig. Ich werde mich hineinlesen und dann wieder hier Posten (hoffentlich die Lösung).
Ich komme noch auf keinen grünen Zweig. Wie würdet Ihr das denn angehen, welche Maps würdet ihr benutzen, wären HashMaps gut oder HashSets besser, oder bin ich da ganz auf dem falschen Weg?
HashSet ist keine Map, insofern ein falscher Weg,
welche Map ist komplett egal, eine TreeMap hätte was von JTree, bei meinem Ansatz wird dieser Aufbau aber überhaupt nicht genutzt,
was durchaus noch denkbar wäre:
wenn du c:\x\y\home hast, dann ist c:\ immer noch root, x in erste Ebene, y in zweiter Ebene, home in dritter,
eine Information die in meinem letzten Post gar nicht vorkam
(edit: Quatsch, eine TreeMap hängt nicht wie ein JTree genau von den Stufen ab, verwirrt hier wohl mehr, welche Map ist immer noch egal, HashMap ist ok)
wie auch immer, viele Wege führen nirgendwo hin, wenn du noch über die Wahl der Map oder anderer Dinge nachdenkst hast du anscheinend noch gar nichts programmiert, so gehts nicht voran, hab schon ziemlich viel verraten,
programmiere doch ein bisschen, poste einen Ansatz, stelle eine sinnvolle Frage zu einem Detail welches du nicht verstehst
oder ähnliches
Ich habe nun einen Ansatz auf String-Ebene, ist aber noch nicht ganz fertig. Würde mich über Kritik freuen. Inwiefern mir eine Map helfen könnte, habe ich noch nicht kapiert, bitte gib mir noch einen Tip Slater_B. Nodes.java
Java:
/*
*HINWEIS:
*Die Datei-Objekte sind für Unix formatiert ("file:/"), daher weiss ich nicht ob sich das in Windows ("file:/c:/"??)testen lässt.
*Die Dateien müssen nicht existieren.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.*;
import java.util.List;
import java.util.Map;
public class Nodes {
static List<File> filelist = new ArrayList<File>();
static Map<Integer, File> fileMap;
public static void main(String args[]) {
File f1 = new File("file:/home/subn0de/test");
File f2 = new File("file:/home/subn0de/test01");
File f3 = new File("file:/home/subn0de/Downloads/asdf");
File f4 = new File("file:/home/subn0de/Downloads/skydomes/5313_Filey.png");
File f5 = new File("file:/home/subn0de/1/2/3/winzig");
filelist.add(f1);
filelist.add(f2);
filelist.add(f3);
filelist.add(f4);
filelist.add(f5);
File home = new File("file:/home");
File root = new File("file:/");
System.out.println(root);
System.out.println(filelist);
for(int i=0;i<filelist.size();i++) {
if (filelist.get(i)!=null) {
StringBuilder parentsb = new StringBuilder(), parentsb2 = new StringBuilder();
parentsb.append(filelist.get(i)); //copy file to stringbuilder
if (parentsb.indexOf("/")!=parentsb.lastIndexOf("/")) { //wenn Pfad.length > 0
parentsb2.append(parentsb, parentsb.indexOf("/"), parentsb /**DONE <-- NullPointer in here */ //nächsthöherer knoten
.lastIndexOf("/"));
File parent = new File("file:/" + parentsb2);
String parentContains=parent.toString();
System.out.println("Knoten:\n" + parent + "\nKinder:\n");
for (int i2 = 0; i2 < filelist.size(); i2++) {
/**
* TODO
* - für jedes Blatt im Knoten, wird der Knoten zusätzlich dargestellt. java.util.set anschauen oder Liste zum Abgleich.
* - Knoten ohne Blätter werden nicht angezeigt
*/
if (
filelist.get(i2).toString().contains(parentContains) /**File ist Kind von parentFile*/
&&
filelist.get(i2).toString().lastIndexOf("/")<=parentContains.length()+1 /**Kind != Kind von Kinderknoten*/
&&
filelist.get(i2).toString().length()>parentContains.length()+1 /**Kind != parent*/
){
System.out.println(" +-"+filelist.get(i2));
}//end if filelist.get(i2).toString().contains(parentContains)
}//end for (int i2 = 0; i2 < filelist.size(); i2++) {
}//end if (parentsb.indexOf("/")!=parentsb.lastIndexOf("/")) {
}//end if (filelist.get(i)!=null) {
}//end for(int i=0;i<filelist.size();i++) {
} //end main
} //end class
/** TODO:
* - sortieren
* - mehrfache nodes,so.
*/
soviel macht die Map gar nicht, wenn man dein Programm voraussetzt könnte man es lediglich als Zwischenspeicher bezeichnen,
für den Parent 'file:/home/subn0de' hast du zwei Dateien, es wird zweimal haargenau dieselbe Ausgabe getätigt,
bei 10 Dateien in diesem Verzeichnis wäre das ziemlich nervig
würdest du beim ersten Auffinden dieser 10 Dateien zum Parent die Zuordnung in der Map speichern, müsstest du das nächstes Mal nicht wiederholen,
ganz grob in folgender Modifikation zu sehen:
(ich musste unter Windows / zu \\ machen)
Java:
public class Test {
public static void main(String[] args) {
Nodes.main(null);
}
}
class Nodes {
static List<File> filelist = new ArrayList<File>();
static Map<String, List<File>> fileMap = new HashMap<String, List<File>>();
public static void main(String args[])
{
File f1 = new File("file:/home/subn0de/test");
File f2 = new File("file:/home/subn0de/test01");
File f3 = new File("file:/home/subn0de/Downloads/asdf");
File f4 = new File("file:/home/subn0de/Downloads/skydomes/5313_Filey.png");
File f5 = new File("file:/home/subn0de/1/2/3/winzig");
filelist.add(f1);
filelist.add(f2);
filelist.add(f3);
filelist.add(f4);
filelist.add(f5);
File home = new File("file:/home");
File root = new File("file:/");
System.out.println(root);
System.out.println(filelist);
for (int i = 0; i < filelist.size(); i++)
{
StringBuilder parentsb = new StringBuilder(), parentsb2 = new StringBuilder();
parentsb.append(filelist.get(i));
if (parentsb.indexOf("\\") != parentsb.lastIndexOf("\\"))
{
parentsb2.append(parentsb, parentsb.indexOf("\\"), parentsb.lastIndexOf("\\"));
File parent = new File("file:/" + parentsb2);
String parentContains = parent.toString();
System.out.println("untersuche parent: " + parentContains);
if (fileMap.containsKey(parentContains))
{
System.out.println("parent schon bekannt, tschüss");
continue;
}
List<File> childs = new ArrayList<File>();
for (int i2 = 0; i2 < filelist.size(); i2++)
{
File f = filelist.get(i2);
String fst = f.toString();
if (fst.contains(parentContains) && fst.lastIndexOf("\\") <= parentContains.length() + 1
&& fst.length() > parentContains.length() + 1)
{
childs.add(f);
}
}
fileMap.put(parentContains, childs);
System.out.println("saved " + childs.size() + " childs for " + parentContains);
}
}
for (String key : fileMap.keySet())
{
System.out.println("key: " + key + ", " + fileMap.get(key));
}
}
}
nach meiner Idee würde die Map etwas anders eingesetzt werden,
da speichert man zu einem Parent nur die aktuelle Datei in der Liste, sucht nicht mit einer weiteren Schleife gleich alle weiteren passenden Dateien,
sondern einfach nur die Liste genau einmal durchlaufen, wenn dann wieder eine Datei zu einem schon bekannten Parent kommt,
dann in der Map in die schon vorhandene Liste hinzufügen, hatte ich ja alles schon geschrieben
------
du musst dich aber auch nicht zwanghaft an die Map halten, nur eine Idee von vielen,
dein Programm ist auch schon recht weit, damit stehst du vom ursprünglichen Stand aus
> Genau da liegt mein Problem: ich weiss nicht wie ich die Verzeichnisse extrahieren soll, sodass ich einen Knoten daraus erstellen kann.
schon weitaus besser da
ein wichtiger Punkt ist allerdings noch, die Oberverzeichnisse weiter zu zerlegen,
falls nicht /home/subn0de/test + /home/subn0de/Downloads/asdf zwei unterschiedliche root-Knoten im JTree sein sollen,
musst du sie Schicht um Schicht auseinandernehmen, das gemeinsame Verzeichnis /home/subn0de feststellen,
dafür jedesmal mit der zweiten Schleife alle zugehörigen Dateien suchen wäre ungünstig
lieber wirklich nur eine Schleife über die File-Liste, jede Datei genau einmal untersuchen,
eine innere Schleife braucht es aber schon über die zerlegten Ebenen /home/subn0de/Downloads, /home/subn0de/, /home usw.