Netzlaufwerke erkennen

palador

Mitglied
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\?

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
 

Empire Phoenix

Top Contributor
Hm normalerweise sit ja der sinn von entzwerklaufwerken, dass diese sich vollkomen tranzparent verhalten.
Ich weiß das es über c/c++ möglich ist darauf zugriff zu erhalten bo es sich um netzlaufwerke handelt, aber rein mit java ist das denke ich nciht möglich.
 
G

Gast2

Gast
Kannst über "net share" und "net use" und Runtime.exec() arbeiten. Aber so wirklich schön ist das auch nicht ;)
 

palador

Mitglied
Ok, erstmal besser als nichts. Da das Programm sowieso meistens unter Windows läuft, kann ich net use ja verwenden. Wenns nicht klappt (z.B. auf anderer Plattform) , ist es ja auch nicht so wild, es funktioniert ja auch mit den klassischen java.io.File, halt blos recht lahm.
Hier meine (temporäre) Lösung:
Java:
package org.javaforum.bsp;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.filechooser.FileSystemView;

public class NetDriveTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		for (File root : File.listRoots()) {
			System.out.println(root + ": " + getNetworkPath(root));
		}
	}

	private static Pattern NETWORK_PATH_PATTERN = Pattern.compile("\\\\\\\\[^\\\\]+\\\\.+"); // :)

	/**
	 * Converts a root-{@link File} to a network path.
	 * 
	 * @param rootFile
	 * @return the networkpath or <code>null</code> if <code>rootFile</code> is
	 *         not a netdrive, a filesystemroot or if it is not possible to find
	 *         out the networkpath
	 * @throws IllegalArgumentException
	 *             when <code>rootFile</code> is <code>null</code>
	 */
	public static String getNetworkPath(File rootFile) throws IllegalArgumentException {
		if (rootFile == null) {
			throw new IllegalArgumentException("rootFile must not be null");
		}

		String result = null;

		// test if is rootfile
		if (FileSystemView.getFileSystemView().isFileSystemRoot(rootFile)) {

			// test if platform is windows
			if (System.getProperty("os.name").toLowerCase().contains("win")) {

				// try via net use (works on windows only)
				String drive = rootFile.getAbsolutePath();
				int index = drive.indexOf(':');
				if (index != -1) {
					drive = drive.substring(0, index + 1);
				}
				InputStream procIS = null;
				try {
					Process proc = Runtime.getRuntime().exec(new String[] {
							"cmd", "/C", "net use " + drive
					});
					procIS = proc.getInputStream();
					ByteArrayOutputStream bArrOS = new ByteArrayOutputStream(1024);

					// stream procIS to bArrOS
					int size;
					byte[] buf = new byte[32];
					while ((size = procIS.read(buf)) >= 0) {
						bArrOS.write(buf, 0, size);
					}

					// byteArray to String
					// TODO: find out consolecharset
					String procOutput = bArrOS.toString("US-ASCII");

					// extract netpath if any
					Matcher matcher = NETWORK_PATH_PATTERN.matcher(procOutput);
					result = (matcher.find()) ? matcher.group() : null;

				} catch (IOException e) {

					// TODO: log exception
				} finally {
					// close procstream
					if (procIS != null) {
						try {
							procIS.close();
						} catch (IOException e) {
							// TODO: log exception
						}
					}
				}

			}
		}

		return result;

	}
}

Aber vieleicht kennt ja jemand noch eine elegantere Lösung?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
I Best Practice Kreise erkennen Allgemeine Java-Themen 1
N Erkennen eines Programs Allgemeine Java-Themen 2
P Strukturänderungen/abnormalien in Logfiles automatisch erkennen Allgemeine Java-Themen 5
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
T Java Windows sounds erkennen Allgemeine Java-Themen 1
M Backslash erkennen Allgemeine Java-Themen 4
D Flasche Eingabe erkennen Allgemeine Java-Themen 4
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Datei zugriffe erkennen Allgemeine Java-Themen 25
A Großbuchstaben erkennen (Prozente) Allgemeine Java-Themen 2
U Erkennen, ob PC benutzt wird Allgemeine Java-Themen 4
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
S Generellen MausKlick am PC erkennen Allgemeine Java-Themen 1
J Erkennen, ob Programm in JAR (neues Problem) Allgemeine Java-Themen 7
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
T Sechsecke, erkennen von bestimmten Werten Allgemeine Java-Themen 9
M Erkennen, in welcher Methode sich die VM befindet Allgemeine Java-Themen 6
Hoppelmann "Variable" in String erkennen Allgemeine Java-Themen 2
D IP / Domain in einem String erkennen Allgemeine Java-Themen 2
J jexcelapi - Erkennen von Sheets Allgemeine Java-Themen 3
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
K Quadrat in einem Bild erkennen Allgemeine Java-Themen 33
D Regex Raute erkennen Allgemeine Java-Themen 2
F Groovy Erkennen geometrischer Formen in einem Kantenbild Allgemeine Java-Themen 4
K Wiederholungen in Datensatz erkennen?! Allgemeine Java-Themen 6
S Wörter ohne Leerzeichen erkennen Allgemeine Java-Themen 5
M Festplatte am Namen erkennen Allgemeine Java-Themen 2
A Erkennen welches Fenster bei windowDeactivated aktiviert wird? Allgemeine Java-Themen 2
C Reguläre Ausrücke Punkte im Satz richtig erkennen Allgemeine Java-Themen 6
J Exe Datei in Java erkennen??? Allgemeine Java-Themen 4
H File Attribut bzw Link erkennen Allgemeine Java-Themen 5
DamienX Debug Modus zur Laufzeit erkennen Allgemeine Java-Themen 3
data89 Barcodes in Bild erkennen Allgemeine Java-Themen 17
G Wechseldatenträger erkennen Allgemeine Java-Themen 5
T Shapes vergleichen? Zeichen erkennen? Allgemeine Java-Themen 7
Daniel_L RTF - Format aus Zwischenablage erkennen und "einlesen"? Allgemeine Java-Themen 5
B Zeilenumbruch erkennen Allgemeine Java-Themen 22
H Dateiende erkennen, wie? Allgemeine Java-Themen 7
S Dateiart erkennen Allgemeine Java-Themen 13
X Position eines Gegenstandes über Webcam erkennen Allgemeine Java-Themen 11
S unter UNIX - (symbolic) links erkennen? Allgemeine Java-Themen 12
D Datum korrekt erkennen Allgemeine Java-Themen 27
G Stringformen erkennen Allgemeine Java-Themen 8
N Endlosschleifen automatisiert erkennen (Code oder Laufzeit)? Allgemeine Java-Themen 6
G Größte zusammenhängende Fläche erkennen Allgemeine Java-Themen 3
K ersten programmstart erkennen Allgemeine Java-Themen 7
S JTree selektion erkennen und drauf reagieren Allgemeine Java-Themen 2
E Regexfrage (' erkennen) Allgemeine Java-Themen 4
C WindowStyle von Windows erkennen. Allgemeine Java-Themen 3
J Erkennen aus welchem Pfad das Jar gestartet wurde Allgemeine Java-Themen 6
B Erkennen welche Objekte den Heap verbrauchen? Allgemeine Java-Themen 2
MQue JButton erkennen Allgemeine Java-Themen 2
V Erkennen ob das Programm aus Jar File geladen wurde Allgemeine Java-Themen 9
T Einfachen Ton erkennen Allgemeine Java-Themen 7
R Hinzufügen von Dateien in einem Verzeichniss Auto. erkennen! Allgemeine Java-Themen 15
L objekte erkennen? Allgemeine Java-Themen 9
M Encoding automatisch erkennen Allgemeine Java-Themen 4
J Programmteile erkennen? Allgemeine Java-Themen 4
H Exception erkennen Allgemeine Java-Themen 10
S Farbe erkennen! Allgemeine Java-Themen 3
H existierende dateien erkennen Allgemeine Java-Themen 9
Natorion Erkennen ob das Programm mittels Jar-Datei oder class . Allgemeine Java-Themen 9
A Endlosschleifen automatisch erkennen Allgemeine Java-Themen 6
G String als Zahl erkennen Allgemeine Java-Themen 19

Ähnliche Java Themen

Neue Themen


Oben