Hallo Javamenschen,
hier mein kleines Problem mit java.io.File:
Situation:
Ziel ist ein TreeModel für Swing, welches den Dateibaum vom Arbeitsplatz an darstellt. Eine Ebene unter dem Arbeitsplatz befinden sich die anderen Laufwerke, die ich via File.listRoots() ermittle.
Das ganze funktioniert auch wunderbar.
Nur ist der Zugriff auf Netzlaufwerke recht langsam. Weil wenn man auf untergeordnete Files Operationen durchführt wie .isFile() oder .length() wird jedesmal eine Abfrage losgeschickt.
Wireshark sagt: bei .listFiles() werden via SMB alle benötigten Informationen (ob Datei, Dateigröße...) für jede Datei mitgeliefert. Sie nochmal zu besorgen ist nicht sinnvoll.
Klar: die Implementateure wollten sicherstellen, das man die aktuellste Information erhällt, Dateien ändern sich ja auch mal.
Nun habe ich JCifs getestet und da funktioniert alles so wie ich möchte, d.h. nur eine Abfrage aus der alle Informationen verwertet werden.
Problem:
File.listRoots() gibt mir alle Laufwerke, die das System kennt. Wie erkenne ich ein Netzlaufwerk? Und wie bekomme ich die SMB-URL raus?
Beispiel:
Netzlaufwerk z:\ verweist auf \\blubHost\irgenteinordner\
File rootLocal = new File("c:\\");
File rootNet = new File("z:\\");
wie bekomme ich raus, das rootLocal ein Netzlaufwerk ist und rootNet nicht?
wie komme ich von rootNet auf \\blubHost\irgenteinordner\?
Sorry, dass es soviel geworden ist, hab ein Problem micht kurzzufassen.
Danke im vorraus.
Palador
hier mein kleines Problem mit java.io.File:
Situation:
Ziel ist ein TreeModel für Swing, welches den Dateibaum vom Arbeitsplatz an darstellt. Eine Ebene unter dem Arbeitsplatz befinden sich die anderen Laufwerke, die ich via File.listRoots() ermittle.
Das ganze funktioniert auch wunderbar.
Nur ist der Zugriff auf Netzlaufwerke recht langsam. Weil wenn man auf untergeordnete Files Operationen durchführt wie .isFile() oder .length() wird jedesmal eine Abfrage losgeschickt.
Wireshark sagt: bei .listFiles() werden via SMB alle benötigten Informationen (ob Datei, Dateigröße...) für jede Datei mitgeliefert. Sie nochmal zu besorgen ist nicht sinnvoll.
Klar: die Implementateure wollten sicherstellen, das man die aktuellste Information erhällt, Dateien ändern sich ja auch mal.
Nun habe ich JCifs getestet und da funktioniert alles so wie ich möchte, d.h. nur eine Abfrage aus der alle Informationen verwertet werden.
Problem:
File.listRoots() gibt mir alle Laufwerke, die das System kennt. Wie erkenne ich ein Netzlaufwerk? Und wie bekomme ich die SMB-URL raus?
Beispiel:
Netzlaufwerk z:\ verweist auf \\blubHost\irgenteinordner\
File rootLocal = new File("c:\\");
File rootNet = new File("z:\\");
wie bekomme ich raus, das rootLocal ein Netzlaufwerk ist und rootNet nicht?
wie komme ich von rootNet auf \\blubHost\irgenteinordner\?
Java:
public static void main(String[] args) throws Exception {
// z: ist ein Netzlaufwerk, beide zeigen auf den Gleichen Ordner im
// Netzwerk
File netDrive = new File("z:\\");
SmbFile smbNetDrive = new SmbFile("smb://blubHost/irgenteinordner/");
// unterdateien listen
File[] files = netDrive.listFiles(); // diese Abfrage würde reichen
for(File file : files) {
String name = file.getName();
long length = file.length(); // !!! extra abfrage !!!
// ... do sth
}
// das gleiche mit jcifs
SmbFile[] smbFiles = smbNetDrive.listFiles(); // einzigste abfrage
for(SmbFile smbFile : smbFiles) {
String name = smbFile.getName();
long length = smbFile.length(); // !!! keine extra abfrage !!!
// ... do sth
}
}
Sorry, dass es soviel geworden ist, hab ein Problem micht kurzzufassen.
Danke im vorraus.
Palador