[Java] Removeable drives detecteren

Pagina: 1
Acties:

  • YopY
  • Registratie: September 2003
  • Laatst online: 29-01 15:35
Ik ben op het moment bezig met een webapplicatie waarbij de gebruiker via een webinterface door de directorystructuur van de server kan browsen. Nu loop ik daarbij tegen het volgende probleem aan. Wanneer de gebruiker (op Windows) in het driveoverzicht komt, kan hij of zij ook op de removable drives klikken (A:\, bijvoorbeeld). Het programma wil vervolgens een directoryoverzicht van die drive opvragen. Echter, wanneer er geen CD of floppy in die drive zit, geeft Windows een foutmelding (geen schijf in de drive) en hangt het programma totdat er op de melding gedrukt wordt.

Wat niet wenselijk is natuurlijk. Nu is mijn vraag, is er een manier om te bepalen of een bepaalde drive een removable drive is in Java?

Ik heb op internet gezocht naar een mogelijke oplossing, maar ik kon maar twee vinden, en beide zijn verre van elegant. De eerste is gebruik maken van een native DLL bestand en die inladen in Java, en de andere maakt gebruik van DOS output om de eventuele foutmelding te bepalen.

Nu is mijn vraag: is er een elegantere / betere / native Java manier om dit probleem op te lossen, of moet ik handmatig invullen welke drives niet gekozen mogen worden?

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Voor floppy en CD's kun je makkelijk de aanwezigheid checken met File#exists().

  • YopY
  • Registratie: September 2003
  • Laatst online: 29-01 15:35
Dat kan wel, maar dan krijg je nog steeds het dialoogvenster van Windows die zegt dat er geen diskette inzit, en het programma blijft hangen totdat je dat dialoogvenster wegklikt - wat niet ideaal is voor een programma waarbij de gebruikers geen toegant hebben tot de PC waar het programma op draait.

[ Voor 46% gewijzigd door YopY op 26-11-2007 10:06 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dan heb je die kennelijk al geopend voordat je de exists() hebt getest.

  • YopY
  • Registratie: September 2003
  • Laatst online: 29-01 15:35
code:
1
2
3
4
5
6
7
8
9
File[] files = File.listRoots();

for (File f : files) {
    if (f.exists()) {
        log.debug("exists");
    } else {
        log.debug("doesn't exist");
    }
}


stukje proefcode, geeft dezelfde melding aan - wordt niet geopend voordat exists() wordt getest. De exists() functie vraagt waarschijnlijk aan windows of de drive bestaat, en Windows wil de drive openen om dit na te kijken, wat leidt tot de melding.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Die geeft hier geen melding op de floppy en de 2 opticals. Het zou zomaar JRE of zelfs OS specifiek kunnen zijn.

Welke JRE gebruik je? Ik heb 3 verschillende geprobeerd op WinXP SP2 en ik krijg geen popup ofzo.
C:\Documenten\Java\Test>echo import java.io.File; public class Test { public static void main(String[] args) { System.out.println(new File("A:").exists()); } } > Test.java

C:\Documenten\Java\Test>cd "\Program Files\Java\j2re1.4.2_10\bin"

C:\Program Files\Java\j2re1.4.2_10\bin>javac c:\Documenten\Java\Test\Test.java

C:\Program Files\Java\j2re1.4.2_10\bin>java Test
false

C:\Program Files\Java\j2re1.4.2_10\bin>cd ..\..\jre1.5.0_09\bin

C:\Program Files\Java\jre1.5.0_09\bin>javac c:\Documenten\Java\Test\Test.java

C:\Program Files\Java\jre1.5.0_09\bin>java Test
false

C:\Program Files\Java\jre1.5.0_09\bin>cd ..\..\jre1.6.0_03\bin

C:\Program Files\Java\jre1.6.0_03\bin>javac c:\Documenten\Java\Test\Test.java

C:\Program Files\Java\jre1.6.0_03\bin>java Test
false

C:\Program Files\Java\jre1.6.0_03\bin>

  • YopY
  • Registratie: September 2003
  • Laatst online: 29-01 15:35
Vreemd... Ik gebruik nog JRE 1.5, ik zie dat jij al bij 1.6 bent, misschien hebben ze het daar opgelost. Ik zal eens proberen om die te installeren, voor hetzelfde hebben ze dit probleem daarin opgelost.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik heb het dus met 1.4.2_10, 1.5.0_09 en 1.6.0_03 getest.

  • YopY
  • Registratie: September 2003
  • Laatst online: 29-01 15:35
Hrm, ik zie het. Ik heb het ook geprobeerd in een op zichzelf staand programmaatje (ik gebruikte het eerst in de webapplicatie zelf), en daarbij kreeg ik de melding ook niet. Ik ben er nu vrij zeker van dat het probleem hem niet in Java of mijn programma zit, maar in de webserver (Jetty in dit geval). Maar dan is het nog vreemd, vind ik, aangezien het als een gewoon Java programma zou moeten draaien.

Edit: Ik ben er achter gekomen dat het alleen gebeurt bij het diskettestation: CD-Rom schijven geven geen melding. Ik heb het nu opgelost door te controleren op het besturingssysteem (windows) en te kijken naar de A:\ driveletter, zodat de A:\ niet gecontroleerd wordt maar gewoon weggelaten wordt.

In ieder geval bedankt, en indien er nog iemand een wat elegantere oplossing weet, laat het me weten :).

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static File[] getDrives() throws IOException {
        File[] roots = File.listRoots();
        
        if (System.getProperty("os.name").startsWith("Windows")) {
            List<File> files = new ArrayList<File>();
            for (File f : roots) {
                if (!f.getCanonicalPath().equals("A:\\") && f.exists()) {
                    files.add(f);
                }
            }
            roots = files.toArray(new File[0]);
        }
        return roots;
    }

[ Voor 53% gewijzigd door YopY op 26-11-2007 11:25 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Wellicht gebruikt Jetty een andere JRE? Ik heb het zojuist even op Tomcat 6.0 en Glassfish v2 getest, eveneens op een XP SP2 omgeving. Deze leverden geen enkel probleem op met
Java Server Page:
1
<% out.print(new java.io.File("A:").exists()); %>
De beide servers zijn afgesteld op JRE 1.5.0_11.

[ Voor 13% gewijzigd door BalusC op 26-11-2007 18:43 ]


  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 29-01 15:00
YopY schreef op maandag 26 november 2007 @ 11:11:
Hrm, ik zie het. Ik heb het ook geprobeerd in een op zichzelf staand programmaatje (ik gebruikte het eerst in de webapplicatie zelf), en daarbij kreeg ik de melding ook niet. Ik ben er nu vrij zeker van dat het probleem hem niet in Java of mijn programma zit, maar in de webserver (Jetty in dit geval). Maar dan is het nog vreemd, vind ik, aangezien het als een gewoon Java programma zou moeten draaien.

Edit: Ik ben er achter gekomen dat het alleen gebeurt bij het diskettestation: CD-Rom schijven geven geen melding. Ik heb het nu opgelost door te controleren op het besturingssysteem (windows) en te kijken naar de A:\ driveletter, zodat de A:\ niet gecontroleerd wordt maar gewoon weggelaten wordt.

In ieder geval bedankt, en indien er nog iemand een wat elegantere oplossing weet, laat het me weten :).
Als je dan toch hard-coded de drive-letter van het diskettestation opneemt, zou je dat ook voor B:\ moeten doen. Deze is bij mijn weten in Windows namelijk ook gereserveerd voor een floppy-drive.

If the world wouldn't suck, we'd all fall off


  • tweakerbee
  • Registratie: Maart 2000
  • Laatst online: 29-01 11:53

tweakerbee

dus..?

De meest elegante oplossing is ws. toch met JNI via een DLL checken of het een floppy station is. Anders kun je met mappings van netwerkdrives op B:\ bijv. ook in de knoei komen.

You can't have everything. Where would you put it?


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

File#exists() zou technisch gezien ruimschoots moeten volstaan. Windows moet zich er gewoon niet mee bemoeien. Mij intrigeert daarom meer waarom zijn Windowsomgeving een foutmelding geeft zodra de code via Jetty wordt uitgevoerd.

YopY, heb je ook andere JRE's geprobeerd icm Jetty of, beter, een andere appserver?

  • YopY
  • Registratie: September 2003
  • Laatst online: 29-01 15:35
Nadat ik opmerkte dat je ook de andere JRE's had gebruikt, heb ik dat niet meer getest. Ik gebruik Jetty ook alleen maar voor het ontwikkelen, ik heb het nog niet getest op bijvoorbeeld Tomcat oid. Ik zal eens kijken wat die ervan zegt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
A: en B: zijn zeker niet voor floppies gereserveerd. En met SD card readers is het probleem nog groter; vanwege het beperkte aantal letters heb ik die bijvoorbeeld als C:\cards\SD\ gemount (dus niet eens een drive letter)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1