Newsgroup: it.comp.java
Titolo: Problema con classe File

Salve, ho il seguente problema:
se eseguo una classe contenente la riga
        File fileLst[]=(new File("A:/")).listFiles();
dal prompt del DOS (win2000) e nessun floppy si trova nel drive A: mi appare
un messaggio di errore del tipo "nessun floppy nel drive A:\" e sono
costretto a premere uno tra i tasti Annulla,Ignora e Termina; premendo
Annulla tutto fila liscio e la mia applicazione continua a funzionare.
se la stessa riga di codice viene eseguita da JCreator e nel floppy non c'è
nessun disco, il messaggio sopra citato non mi viene proposto.
Inoltre se copio la riga di comando generata da JCreator e la eseguo dal
prompt dei comandi viene comunque visualizzato quel messaggio.
Perchè JCreator riesce ad occultare quel messaggio?
La riga di comando è :
"C:\j2sdk1.4.0\bin\java.exe"  -classpath
"e:\java\test1\GestImg\classes\;C:\j2sdk1.4.0\jre\lib\rt.jar;C:\j2sdk1.4.0\l
ib\dt.jar;C:\j2sdk1.4.0\lib\tools.jar;C:\j2sdk1.4.0\jre\lib\ext\dnsns.jar;C:
\j2sdk1.4.0\jre\lib\ext\ldapsec.jar;C:\j2sdk1.4.0\jre\lib\ext\localedata.jar
;C:\j2sdk1.4.0\jre\lib\ext\sunjce_provider.jar;e:\ORACLE\ora81\jdbc\lib\clas
ses111.zip;e:\ORACLE\ora81\jdbc\lib\nls_chaset11.zip;E:\Downloads\Jimi1_0\Ji
mi\JimiProClasses.zip" GestImg
Come faccio ad occultare quel messaggio anche dal prompt dei comandi?
Grazie per il vostro aiuto
Daniele

Come faccio ad occultare quel messaggio anche dal prompt dei
comandi?
Inserisci nel file .bat prima di quella riga, la seguente:
@echo
off
--------------------------------
Inviato via 
http://usenet.iol.it
 

 off
Indendevo sempre la DialogBox non il comando in se.
Per ora sono riuscito a capire che se la riga di comando
    java -classpath ...... GestImg
viene eseguita da un'applicazione DOS (.bat o prompt) viene visualizzato
quel messaggio, se eseguo quella riga per esempio con l'istruzione Shell di
Visual Basic la DialogBox intitolata "java.exe - Disco non presente" con il
messaggio "Impossibile trovare il disco nell'unità. Inserire un disco
nell'unità A:." con i tre tasti di opzione Annulla,Riprova e Continua non
viene visualizzata. Però non mi sembra carino creare un programma in C o in
VB per lanciare un pgm in Java in modo tale che non visualizzi quel
messaggio. Secondo me doveva essere il metodo listRoots (class File) ad
omettere il drive A:\ qualora lo stesso non conteneva un floppy, invece non
lo omette.
Ciao
Daniele

 es.  boolean b=(new File("A:/")).exists();
anche la riga di codice
    boolean b=(new File("A:/")).canRead();
si comporta nella stessa maniera
Ciao
Daniele

Indendevo sempre la DialogBox non il comando
in se.
Stessa domanda di sopra!
E non capisco quale č il tuo
problema.Da dove lanci questo programma java?
Perchč tiri in ballo VB e C?


 Perchč tiri in ballo VB e C?
Per sfizio ho voluto vedere se lanciandolo da un pgm in VB funzionava, sono
arrivato a fare questa prova perchč se eseguo l'applicazione da JCreator
quella DialogBox non viene visualizzata, cosě ho pensato al tipo di processo
padre che esegue la JVM. Da VB quella DialogBox non viene visualizzata e da
qui la conferma della mia teoria sul processo padre.
Ciao Daniele

un disco, anche io ho messo tutto tra un costrutto try/catch.
Non avevo fatto caso a come controlli l'esistenza di un file.
E' ovvio che
non ti genera alcuna eccezione!! i metodi che usi non sollevano eccezioni.
Prova ad usare metodi come createTempFile,createNewFile... oppure usa altre
classi come FileWriter che hanno una eccezione nel costruttore
(IOException).
Gestendo in questo modo l'eccezione non dovresti avere più
problemi (almeno qui io non ne ho e lavoro su win2000 lanciando da prompt).


 (IOException).
Io potrei trovarmi nella situazione di dover leggere file da un dispositivo
non abilitato in scrittura, tipo il CDROM, quindi l'unica cosa che potrei
fare e andare in lettura, ma se non conosco i nomi dei file presenti in quel
dispositivo cosa leggo? se provo a farmi dare l'elenco dei file mi
visualizza quella DialogBox, qualora il dispositivo non sia presente.
Comunque quella DialogBox se pur non elegante non influisce sul corretto
funzionamento dell'applicazione, quindi posso anche lasciarla cosi, nella
speranza che il cliente non si lamenti.
Grazie per il tuo interessamento.
Ciao
Daniele

speranza che
il cliente non si lamenti.
Non ci conterei! Come lo gestisci a quel
punto Annulla/Tralascia/Ripeti??
Specie il caso tralascia!! Io scarterei
completamente questa ipotesi.
Tutto il processo deve essere controllato e
gestito da dentro Java.
Tu non puoi sapere cosa viene scelto fra A/T/R e
quindi non puoi gestirlo.
Usa le eccezioni.


 Usa le eccezioni.
Qualunque cosa scelgono se sul dispositivo non si riesce a leggere la lista
dei file non viene proposta e di conseguenza non può succedere niente.
Daccordo perfettamente con te che non è una soluzione proponibile e che
molto probabilmente il cliente si lamenterà.Daltronde posso sempre far
lanciare l'applicazione da uno script VBS o JScript così quel DialogBox non
viene visualizzato.
Ciao
Daniele

viene visualizzato.
Pessimo!
Se mi presentano
uno script per far partire una applicazione non la lancerò mai. E poi la
portabilità?? E hai provato su altri SO?
Strada ricca di insidie....


che sta su un dispositivo devo ottenere la lista dei file.
TI
scrivo un codice molto semplice che funziona sotto win2000 (l'ho provato
personalmente).
Se fai la prova con un dischetto e non lo metti nel floppy
interviene l'eccezione.
*****************************************************************
/*
elenco i file/directory data una path
 *  java ListDir3 path 
 */ es.
ListDir3 a: 
import java.io.*;
public class DirList3 {
public static
void main(String[] args) {
File path; 
String[] list;
if(args.length
== 0)
{path= new File(".");
list = path.list();
for(int i = 0; i <
list.length; i++)
System.out.println(list[i]);
}
else 
{	if(args.length
== 1)
	{
		try
		{
		path= new File(args[0]);
		list = path.list();
for(int i = 0; i < list.length; i++)
		System.out.println(list[i]);
		}
catch(NullPointerException npe){System.out.println("Inserisci il
dischetto");}
	}
	else 
	{
	System.out.println("Errore nella chiamata
della classe");
	}
}
}
} ///:~


 *****************************************************************
Il mio codice è identico al tuo, però per sfizio ho provato anche il tuo,
purtroppo il comportamento è lo stesso, l'eccezione non viene sollevata e la
DialogBox viene visualizzata. In realtà Java è in grado di gestire il
problema del disco non presente, il fatto è che (il mio) win2000 si
intromette nella gestione degli errori di Java, o forse è probabile che java
utilizzi lo standard input/output anche per alcune operazioni su disco,
lasciando che sia il sistema operativo ad occuparsi di eventuali errori.
Daltronde lo standard input/output di una console a 16bit è differente da
quello di una console a 32bit, ecco un altro possibile indizio a carico
della mia ipotesi sul processo padre che chiama la JVM. Se il processo padre
che esegue la JVM è a 16 bit la JVM utilizza lo standard input/output di una
console a 16bit e quindi visualizza quella DialogBox, se il processo padre
che esegue la JVM è a 32 bit la JVM utilizza lo standard input/output di una
console a 32bit che molto probabilmente gestisce quel caso di errore in
maniera differente e non visualizza la DialogBox.
In ambiente Sun Solaris e Linux Suse 7.3 tutto funziona alla perfezione.
Comunque la mia situazione è la seguente:
Sistema   Win2000 pro
JRE        1.4.0 build 1.4.0-b92
Grazie ancora per il tuo interessamento
Ciao
Daniele

JRE
1.4.0 build 1.4.0-b92
Sistema   Win2000 pro
JRE        1.3.1_01
JRE
1.2.2_10


 Ma Win2k è a 32 bit.
anche io ero convinto di questo, ma alcune voci pervenutemi nelle ultime ore
mi hanno detto che win2k è a 32bit solo per l'85%. Forse il prompt dei
comandi rientra in quel maledetto 15%.
Ciao
Daniele

comandi rientra in quel maledetto 15%.
Le voci possono dire
quello che vogliono ma il mio win2k è uguale al tuo!
Il prog. lo lanci
dalla riga di comando semplicemente usando il comando java Prog ?


 dalla riga di comando semplicemente usando il comando java Prog ?
Si, ho provato anche con javaw e anche mettendo la classe in un JAR.
Se la riga "java Prog" la eseguo da uno script (VBS) o da start\esegui la
DialogBox non viene visualizzata
Molto probabilmente è un problema di JVM, tu utilizzi l'1.2 e l'1.3 io
invece l'1.4.

invece
l'1.4.
No è impossibile quelle classi non cambiano.
E infatti ho
provato anche la 1.4 e non ho quel problema.
Qui in ufficio su 10 pc win2k
quel problema non c'è mai!
Puoi provare su un altro pc con win2k?


 Puoi provare su un altro pc con win2k?
Porc... solo sul mio pc si verifica questo problema :-((((((, sugli altri
funziona. L'unica cosa che ho fatto di diverso dagli altri e stata la
disinstallazione del jdk 1.4beta e di forte 3 prima della nuova
installazione del jdk 1.4 final.