File et accès en écriture refusé

Signaler
Messages postés
22
Date d'inscription
lundi 10 novembre 2008
Statut
Membre
Dernière intervention
20 juillet 2009
-
Messages postés
22
Date d'inscription
lundi 10 novembre 2008
Statut
Membre
Dernière intervention
20 juillet 2009
-
Bonjour,


J'ai perdu une journée entière à chercher, googler, tester et je
commence maintenant à croire que j'ai fait le tour de toutes les
solutions possibles...


Je crée une appli qui permet à un utilisateur de traduire un fichier et
de sélectionner l'endroit où il souhaite avoir son fichier traduit :
C:\\..., Bureau...

Si l'utilisateur crée son fichier traduit à un endroit où il a suffisamment de droits, cela fonctionne parfaitement.

Seulement, dans le cas où l'utilisateur veut créer son fichier à un
endroit où il n'a pas les droits suffisants, j'ai plein de lignes
d'erreurs, me disant qu'il ne peut pas écrire ici, ce que je veux,
c'est afficher simplement un message d'erreur pour avertir
l'utilisateur qu'il ne peut pas écrire à cet endroit, et non pas à
chercher à lui accorder ou non quelconque droits...


j'ai tenté plusieurs solutions :

- faire un bloc
try{...}catch(FileNotFoundException){...}

, vu que c'était l'intitulé de l'exception affiché


- utiliser la méthode

canWrite

de la classe File, cette méthode retournant un boolean, afin de dire si le fichier peut être écrit ou non.


- créer ma propre méthode qui utilise canWrite :

publicstaticboolean testEcriture(File f){
if(f.canWrite()){
returntrue;
}
else{
returnfalse;
}
}

Je jugeais cette deuxième et troisième méthode meilleures, mais
dans le cas de la troisième méthode, lorsque j'appelle cette méthode à
partir de la méthode qui m'intéresse, j'ai toujours un false qui est
retourné...qu'il s'agisse d'endroits où l'utilisateur a les droits ou
non...


Je suis à l'écoute de toute idée ou aide de votre part,

merci d'avance,

Harleen

8 réponses

Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
4
Salut,

dans le bloc catch(FileNotFoundException), tu mets ton message d'erreur.
Montre nous ton code car je vois pas trop où est le pb.
Messages postés
22
Date d'inscription
lundi 10 novembre 2008
Statut
Membre
Dernière intervention
20 juillet 2009

salut et merci pour la rapidité de ta réponse,

Voici le code de ma méthode de traduction :
class TradSimpleListener  implements ActionListener{

        public void actionPerformed(ActionEvent arg0){
            SimpleService();
        }
       
        private void SimpleService(){
            //fichier d'entrée et de sortie en récupérant les contenus des zones de txt
        inputFile = new File(txtlocalPath.getText());
        outputFile = new File(txtSortie.getText());
       
        System.out.println(inputFile);
        System.out.println(outputFile);
       
        //récupérer le contenu de la textBox et traduire   
        // System.setProperty("javax.xml.transform.TransformerFactory",
        //"net.sf.saxon.TransformerFactoryImpl");
       
        //on crée une fabrique de transformeurs
        TransformerFactory factory = TransformerFactory.newInstance();
       
        //fichier xsl de transformation
        File fxsl = new File("transfo.xsl");       
       
        //fichier xml source de type source       
            Source xmlSource = new StreamSource(inputFile);
           
        //nom du fichier de sortie de type Result  :
        //on choisit le constructeur avec File   
           
            Result sortie = new StreamResult(outputFile);
           
        //transformer
        Transformer transformer;
        try {
            //on récupère un transformeur à partir d'une fabrique de transformeurs
            transformer = factory.newTransformer(new StreamSource(fxsl));

            //encoding
            // transformer.setOutputProperty("encoding", "ISO-8859-1");
            transformer.setOutputProperty("encoding", "UTF-8");
           
            //pour l'indentation
            transformer.setOutputProperty(OutputKeys.INDENT,"yes");
           
            /*Utilisation d'un parser DOM ou SAX sans DTD ou xml schema pour la validation,
             * s'il ya une erreur de parsing alors le fichier XML n'est pas bien formé càd NON XML.
             */
            DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();           
            DocumentBuilder constructeur = fabrique.newDocumentBuilder();           
           
            // lecture du contenu du fichier d'entrée XML avec DOM
            File xml = new File(inputFile.getName());
            Document document = constructeur.parse(xml);
           
            /*
            //on vérifie que l'on peut bien écrire à cet endroit en appelant la méthode testEcriture
            if(testEcriture(outputFile)==true){
                System.out.println("bonjour");
            }
            else{
                System.out.println("au revoir");   
            }
            */
            //transformation en prenant en paramètre le fichier xml source et fait le fichier xml de sortie           
            transformer.transform(xmlSource, sortie );
           
            //message informant que la traduction a bien été faite
            message_erreur.setText("Traduction simple effectuée");
            message_erreur.setForeground(Color.green);

            btntradcomplique.setEnabled(false);
            btntradsimple.setEnabled(false);

        }
        catch(FileNotFoundException e){
            System.out.println("hello");
        }
        catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch(SAXException se){
            //C'est un fichier Non Xml
        }catch(IOException ioe){
            ioe.printStackTrace();
        }     
           
        }
       
    }//fin de la classe TradSimpleListener

et voici le message d'erreur :
Error on line 20 of transfo.xsl:
  java.io.FileNotFoundException: C:\test.xml (Accès refusé)

Sachant que transfo.xsl est le fichier de transformation et test.xml, le fichier de sortie que j'aimerai pouvoir créer dans C:\\, et où l'écriture est impossible.
Bien évidemment, je ne veux pas lui accorder quelconque droits d'écriture, mais simplement lui mettre un message d'erreur l'informant qu'il ne peut pas écrire ici.
Mais pourquoi n'ai-je pas cette erreur lorsque je crée mon fichier de traduction à un endroit où je peux écrire (mes documents par exemple)?

merci d'avance
Harleen
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
4
t'es sûr que tu passes dans le bon bloc catch ? Ta FileNotFoundException n'est-elle pas encapsulée dans une autre exception ?
Peux tu mettre le message d'erreur en entier ?
J'ai fait un test bidon et le catch sur FileNotFoundException marche très bien (c'est évident d'ailleurs). Par contre le test d'écriture avec la méthode canWrite() n'est pas suffisant (elle me renvoie true alors que je n'ai pas les droits d'écriture)
Messages postés
22
Date d'inscription
lundi 10 novembre 2008
Statut
Membre
Dernière intervention
20 juillet 2009

je suis d'accord avec toi concernant le canWrite qui renvoie un boolean, j'ai toujours le même booléen retourné que l'utilisateur ait le droit ou non d'écriture...

Pourrais-tu me montrer le test que tu as fait, s'il te plait?
Je ne peux retirer aucune exception ici, car j'utilise un parser XML ou encore transformer et ces catch sont nécessaires

Harleen
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
4
Ce n'est pas de retirer une exception mais d'être sûr que tu passes dans le bon bloc catch.
Peux tu mettre la log d'erreur en entier ?

try {

File file = new File("C:/Windows");

System.out.println(file.canWrite());

file = new File("C:/Windows/fr-fr.log");

System.out.println(file.canWrite());

FileOutputStream fileOutputStream = new FileOutputStream(new File("C:/Windows/fr-fr.log"));

} catch (FileNotFoundException e) {

e.printStackTrace();

System.out.println("t'as pas le droit !!!!!!!!!!!");

}
Messages postés
22
Date d'inscription
lundi 10 novembre 2008
Statut
Membre
Dernière intervention
20 juillet 2009

juste une question par rapport à ton test, tu fais un canWrite sur le répertoire et non sur le fichier pour s'assurer que l'utilisateur a bien les droites sur le répertoire et non sur le fichier?

Harleen
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
4
Je voulais voir si ça faisait une différence mais ça me renvoie true dans les 2 cas.
Messages postés
22
Date d'inscription
lundi 10 novembre 2008
Statut
Membre
Dernière intervention
20 juillet 2009

Salut,

après plusieurs heures de recherche, j'ai finalement trouvé la solution en me servant de la méthode createNewFile() de la classe File.
Le test consiste à créer un fichier temporaire et de voir ainsi si l'utilisateur a les droits en écriture.
J'ai longuement cherché du côté de canWrite(), mais j'ai toujours eu le même souci que toi.

Merci pour tes pistes et ton aide,
bonne continuation

Harleen