Partage
  • Partager sur Facebook
  • Partager sur Twitter

Help caractères spéciaux

    22 juillet 2015 à 10:10:24

    Bonjour,

    Dans mon application java je dois récupérer les données de la commande dos "dir <repertoire> *.* /s/B/o/a" qui me liste tous les fichiers d'un répertoire.

    Néanmoins un problème est apparu, les noms de fichiers contenant des caractères spéciaux apparaissent avec des "?".

    Quelqu'un aurait une solution à mon problème ? Voici le code

        public ArrayList<Fichier> donneListeFichiers(String repertoire) {
            try {
                Process p = Runtime.getRuntime().exec("cmd /C dir " + repertoire + " *.* /s/B/o/a");
    
                // read the standard output of the command
                BufferedReader stdInput = new BufferedReader(new InputStreamReader(p
                        .getInputStream(), Charset.forName("UTF-8")));
    
                int count = 0;
                String s;
                String result = "";
                ArrayList<Fichier> liste = new ArrayList<>();
                while (!procDone(p)) {
                    while ((s = stdInput.readLine()) != null) {
                        result = s;
                        System.out.println(result);
                        File fichierInfo = new File(result);
                        Fichier fichier = new Fichier(fichierInfo, effectuerChecksum(fichierInfo));
                        if (fichier.getInfoFichier().isFile()) {
                            liste.add(fichier);
                            count++;
                        }
    
                    }
                }
    
                System.out.println("result:" + count + ": " + result);
                stdInput.close();
                return liste;
            } catch (IOException e) {
                System.out.println("Erreur" + e);
                return null;
            } catch (NoSuchAlgorithmException e) {
                System.out.println("Erreur" + e);
                return null;
            }
        }


    Merci d'avance pour votre aide :) !

    • Partager sur Facebook
    • Partager sur Twitter
      22 juillet 2015 à 11:19:32

      Pourquoi n'utilises-tu pas plutôt une instruction java standard au lieu d'une instruction ne fonctionnant que sur Windows?

      La méthode File.list() http://docs.oracle.com/javase/7/docs/api/java/io/File.html#list(java.io.FilenameFilter. Vois déjà si avec cette méthode, tu as toujours le problème d'encodage.

      • Partager sur Facebook
      • Partager sur Twitter
        23 juillet 2015 à 11:24:31

        Le problème est que je veux liste tous les fichiers d'un répertoire ainsi que ses sous répertoires (sous-sous répertoires etc.). La méthode File.listFiles ne me permet pas de faire cela, elle ne rentrera en aucun cas dans les sous répertoires.

        Merci pour ton aide :)

        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2015 à 11:26:44

          Et avec une fonction récursive qui va parcourir tous les répertoires en testant un par un les fichiers, et si c'est un répertoire va rappeler la fonction avec ce nouveau répertoire.listFiles()?

          Edit : genre :

          private ArrayList<String> fileList;
          
          
          
          public void addFiles(String directory)
          {
              File f = new File(directory);
              for(File ftmp : f.listFiles())
              {
                  if(ftmp.isDirectory)
                  {
                      addFiles(ftmp.getName());
                  }
                  else
                  {
                      fileList.add(ftmp.getName());
                  }
              }
          }



          -
          Edité par Triterium 23 juillet 2015 à 11:32:35

          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2015 à 11:28:54

            Bonjour.

            Tu te doutes bien qu'il existe une méthode en Java pour afficher l’arborescence d'un répertoire :-°

            Regarde la classe Files, particulièrement les méthodes walk

            • Partager sur Facebook
            • Partager sur Twitter
            Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
              23 juillet 2015 à 11:55:48

              Triterium, ta méthode a l'air sympa mais elle me fait un NullPointerException :S

              • Partager sur Facebook
              • Partager sur Twitter
                23 juillet 2015 à 12:00:37

                Tu as bien instancié la liste? (dans ton constructeur fileList = new ArrayList<>();)

                -
                Edité par Triterium 23 juillet 2015 à 12:01:45

                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2015 à 12:06:03

                  package javaapplication9;
                  
                  import java.io.File;
                  import java.util.ArrayList;
                  
                  /**
                   *
                   * @author Nathan
                   */
                  public class JavaApplication9 {
                  
                      /**
                       * @param args the command line arguments
                       */
                      public static void main(String[] args) {
                          String dir = "C:\\users\\Nathan\\desktop\\dir";
                          fileList = new ArrayList<>();
                          addFiles(dir);
                          System.out.println(fileList);
                      }
                  
                      public static void addFiles(String directory) {
                          File f = new File(directory);
                          for (File ftmp : f.listFiles()) {
                              if (ftmp.isDirectory()) {
                                  addFiles(ftmp.getName());
                              } else {
                                  fileList.add(ftmp.getName());
                              }
                          }
                      }
                  
                      private static ArrayList<String> fileList;
                  }
                  


                  C'est un peu un code fait à l'arrache dans le main main oui j'ai instancié la liste :o

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juillet 2015 à 12:08:05

                    A quelle ligne ça fait ça?

                    Sinon essaye de faire ftmp.getAbsolutePathName() au lieu de ftmp.getName();

                    Et Pinguet62 comment ça marche la méthode du walk? ça file un Path, mais qu'en fait-on après?

                    -
                    Edité par Triterium 23 juillet 2015 à 12:09:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 juillet 2015 à 12:15:53

                      Merci beaucoup, ça fonctionne ! :)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 juillet 2015 à 12:41:33

                        Triterium a écrit:

                        Et Pinguet62 comment ça marche la méthode du walk? ça file un Path, mais qu'en fait-on après?

                        Je sais juste que cette fonctionnalité s’appelait comme ça en Python, du coup en tapant "Java walk" sur Google j'ai trouvé cette fonctionnalité en Java.

                        Je n'ai jamais utilisé cette fonction, en quelques secondes j'ai réussi : Stream<Path> stream = Files.walk(Paths.get("path/to/folder")); puis tu utilises ton Stream pour faire ce dont tu as besoin !

                        import java.nio.file.Files;
                        import java.nio.file.Paths;
                        import java.util.stream.Collectors;
                        // -----
                        String folder = "C:/Users/pinguet62/Documents";
                        Files.walk(Paths.get(folder)).forEach(System.out::println); // affichage
                        List<Path> paths = Files.walk(Paths.get(folder)).collect(Collectors.toList()); // list

                        Pas besoin de s'embêter avec les commandes Windows et parser le résultat, ni de fonction récursive buguée, ... tout ça se fait en 1 ligne !

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                          23 juillet 2015 à 12:49:49

                          Ma fonction récursive n'est pas buguée :colere:

                          Merci en tout cas pour ça, je n'ai pas bien étudié les streams, il faudra que je m'y penche (j'utilise toujours des exemples d'autres part pour utiliser les I/O...)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 juillet 2015 à 13:15:05

                            Triterium a écrit:

                            Merci en tout cas pour ça, je n'ai pas bien étudié les streams, il faudra que je m'y penche (j'utilise toujours des exemples d'autres part pour utiliser les I/O...)

                            J'ai publié un cours sur Java 8 sur le CourseLab, incluant une présentation des Streams.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                              23 juillet 2015 à 13:18:18

                              Je vais voir ça de suite :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 juillet 2015 à 15:20:46

                                Pinguet ? Peux tu me dire pourquoi quand je met ton code, il m'affiche une erreur "type List does not take parameters" ?

                                Merci beaucoup ^^

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 juillet 2015 à 15:23:36

                                  C'est bon en fait ^^

                                  J'ai rien dit ^^'

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 juillet 2015 à 15:49:59

                                    Merci de ne pas poster 2 messages consécutifs en l'espace de 12h.

                                    A l'avenir, si tu veux ajouté une information, je te demanderai d'éditer le dernier message que tu as posté.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 juillet 2015 à 12:15:55

                                      Le problème avec  ta méthode, Pinguet, c'est qu'elle n'est pas capable de gérer cette erreur : "java.nio.file.AccessDeniedException" :S

                                      Une idée pour régler ça ?

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 juillet 2015 à 12:49:14

                                        Nathan Canzali a écrit:

                                        Le problème avec  ta méthode, Pinguet, c'est qu'elle n'est pas capable de gérer cette erreur : "java.nio.file.AccessDeniedException" :S

                                        Une idée pour régler ça ?

                                        Le problème est aussi présent avec la solution récursive proposée précédemment !

                                        Un petit FileVisitor : tu définies les règles de navigation et les actions à effectuer pour chacun d'entre eux.

                                        FileVisitor<Path> visitor = new FileVisitor<Path>() {
                                            @Override
                                            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                                                return FileVisitResult.CONTINUE;
                                            }
                                        
                                            @Override
                                            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                                                System.out.println(file);
                                                return FileVisitResult.CONTINUE;
                                            }
                                        
                                            @Override
                                            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                                                System.err.println(file);
                                                return FileVisitResult.CONTINUE;
                                            }
                                        
                                            @Override
                                            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                                                return FileVisitResult.CONTINUE;
                                            }
                                        };

                                        Et pour l'utilisation :

                                        Files.walkFileTree(Paths.get("C:/"), visitor);
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                          24 juillet 2015 à 15:17:54

                                          N'oublie pas qu'un petit tour dans la Javadoc est souvent très utile.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            28 juillet 2015 à 9:30:46

                                            Je suis désolé de re-up le sujet (oui j'ai regardé la javaDoc et j'ai rien compris :( )

                                            Comment on fait, après ta méthode (qui marche très bien) pour récupérer un tableau soit de String soit de File avec tous les fichiers ?

                                            Parce que la je peux juste récupérer un Path, ce qui ne m'avance à rien du tout :S

                                            Merci d'avance ^^

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              28 juillet 2015 à 9:38:45

                                              Ben tu peux transformer ta liste de Path en liste de String en faisant un parcours simple! Après je ne sias pas si c'est une bonne méthode ou s'il y a plus facile, mais ça marche!

                                              Genre :

                                              List<String> ls = new ArrayList<>();
                                              
                                              for(Path p : paths)
                                              {
                                                  ls.add(p.toString());
                                              }



                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                28 juillet 2015 à 9:52:59

                                                Chez moi cela ne marche pas...

                                                Cela fait que de prendre le chemin absolu du paths (C:\Users\Nathan\Desktop\dir)

                                                et ça le divise pour le mettre dans un tableau :( , résultat du tableau :

                                                [Users, Nathan, Desktop, dir]

                                                Mais merci quand même pour ta réponse ^^'

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  28 juillet 2015 à 10:10:08

                                                  Ah ok! Ben utilise ma méthode de récursivité, elle est beaucoup mieux :D
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    28 juillet 2015 à 10:27:30

                                                    Nathan Canzali a écrit:

                                                    Cela fait que de prendre le chemin absolu du paths (C:\Users\Nathan\Desktop\dir)

                                                    et ça le divise pour le mettre dans un tableau :( , résultat du tableau :

                                                    [Users, Nathan, Desktop, dir]

                                                    Tout simplement parce que faire un foreach sur un Path va itérer sur chacun des répertoires intermédiaires : /a/b/c donnera a puis b puis c.
                                                    Ce qu'il voulait dire dans son exemple c'est faire un foreach sur un ensemble de Path : List<Path> par exemple.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                                      28 juillet 2015 à 10:41:52

                                                      Pinguet62 a écrit:

                                                      Et pour l'utilisation :

                                                      Files.walkFileTree(Paths.get("C:/"), visitor);

                                                      Et comment on est censé récupérer une List<Path> depuis cette méthode ?

                                                      C'était ça ma question :S



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        28 juillet 2015 à 10:47:02

                                                        C'est
                                                        List<Path> paths = Files.walk(Paths.get(folder)).collect(Collectors.toList());


                                                        Qui récupère  une liste de path, et ça marche bien si je teste chez moi :)

                                                        Edit : ça ça amrche :

                                                        String folder = "C:\\Users\\Triterium\\Documents\\NetBeansProjects";
                                                                List<Path> paths = Files.walk(Paths.get(folder)).collect(Collectors.toList());
                                                                
                                                                for(Path p : paths)
                                                                {
                                                                    System.out.println(p.toString());
                                                                }



                                                        -
                                                        Edité par Triterium 28 juillet 2015 à 10:48:32

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          28 juillet 2015 à 10:48:15

                                                          Nathan Canzali a écrit:

                                                          Pinguet62 a écrit:

                                                          Et pour l'utilisation :

                                                          Files.walkFileTree(Paths.get("C:/"), visitor);

                                                          Et comment on est censé récupérer une List<Path> depuis cette méthode ?

                                                          class MyVisitor implements FileVisitor<Path> {
                                                          	private final Collection<Path> files = new LinkedList<>();
                                                          
                                                          	@Override
                                                          	public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                                                          		files.add(file);
                                                          		return FileVisitResult.CONTINUE;
                                                          	}
                                                          
                                                              // autres Overrides
                                                          
                                                          	public Collection<Path> getFiles() {
                                                          		return files;
                                                          	}
                                                          }
                                                          
                                                          MyVisitor visitor = new MyVisitor();
                                                          Files.walkFileTree(Paths.get("C:/"), visitor);
                                                          Collection<Path> files = visitor.getFiles();
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)

                                                          Help caractères spéciaux

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                          • Editeur
                                                          • Markdown