Foro de elhacker.net

Programación => Java => Mensaje iniciado por: zaico en 22 Abril 2012, 18:29 pm



Título: Listado recursivo
Publicado por: zaico en 22 Abril 2012, 18:29 pm
Estoy intentando crear un programa en java para un proyecto que me liste los directorios de una forma similar al comando "tree" de linux de manera que cada fichero y subdirectorio tenga una rama que lo una con su padre y que las ramas acaben en un fichero o subdirectorio. La verdad es que llevo todo el fin de semana dandole vueltas y he conseguido bastante pero el problema es que no me lo llega a hacer bien del todo. A veces no me comunica la rama del directorio con su padre o bien sigue la rama sin haber ningun directorio. Os pongo el codigo:

Código
  1. import java.io.*;
  2.  
  3. public class Listado_Arbol {
  4.  
  5.  
  6.  public static void main(String[] args) {
  7.  
  8.    File dir = new File("./../");
  9.  
  10.    listar(dir,0);
  11.  
  12.  }
  13.  
  14.  public static void listar(File dir, int nivel) {
  15.  
  16.    if (dir.isDirectory()) {
  17.      File[] files = dir.listFiles();
  18.  
  19.  
  20.    for(int i=0; i<nivel-1; i++) {
  21.      if (files!= null){
  22.        System.out.print("| ");
  23.      }else{
  24.        System.out.print("  ");
  25.      }
  26.    }
  27.  }
  28.  if (nivel>0)System.out.print("|_ ");
  29.  System.out.println(dir.getAbsolutePath());
  30.  
  31.  try {
  32.  
  33.    for(File f : dir.listFiles()) {
  34.      if (f.isFile()) {
  35.        for(int i=0; i<nivel; i++) {
  36.          if (i==0){
  37.            System.out.print("| ");
  38.          }else{
  39.            System.out.print("  ");
  40.          }
  41.        }
  42.        System.out.println("|_ "+f.getName());
  43.      }
  44.    }
  45.  
  46.    for(File f : dir.listFiles()) {
  47.      if (f.isDirectory()) {
  48.  
  49.        listar(f,nivel+1,);
  50.  
  51.      }
  52.    }
  53.  
  54.  } catch(Exception e) {
  55.    System.out.println("No se ha podido listar");
  56.  }
  57. }
  58.  



Alguien me puede decir que es lo que esta mal ? o falta? porque por mucho que lo intento no lo veo:


Título: Re: Listado recursivo
Publicado por: Proteus1989 en 27 Abril 2012, 03:02 am
Te paso un código que hice algún tiempo de esto mismo, espero que te ayude.

Código
  1. private ArrayList<File> vector = new ArrayList<File>();
  2.  
  3. /*LISTAR TODO*/
  4.  
  5. public ArrayList<File> listarTodo(File dir)
  6. {
  7. vector.clear();
  8. listarT(dir);
  9. return vector;
  10. }
  11. private void listarT(File dir)
  12. {
  13. if (dir.isDirectory())
  14. {
  15. vector.add(dir);
  16. String[] children = dir.list();
  17. for (int i = 0; i < children.length; i++)
  18. listarT(new File(dir, children[i]));
  19.  
  20. } else
  21. vector.add(dir);
  22. }
  23.  
  24. /*LISTAR SOLO SUBCARPETAS*/
  25.  
  26. public ArrayList<File> listarCarpetas(File dir)
  27. {
  28. vector.clear();
  29. listarC(dir);
  30. return vector;
  31. }
  32. private void listarC(File dir)
  33. {
  34. if (dir.isDirectory())
  35. {
  36. vector.add(dir);
  37. String[] children = dir.list();
  38. for (int i = 0; i < children.length; i++)
  39. listarC(new File(dir, children[i]));
  40. }
  41. }
  42.  
  43. /*LISTAR TODO SIN SUBCARPETAS*/
  44.  
  45. public ArrayList<File> listarSinRepeticion(File dir)
  46. {
  47. vector.clear();
  48. listarSR(dir);
  49. return vector;
  50. }
  51. private void listarSR(File dir)
  52. {
  53. if (dir.isDirectory())
  54. {
  55. vector.add(dir);
  56. String[] children = dir.list();
  57. for (int i = 0; i < children.length; i++)
  58. vector.add(new File(dir, children[i]));
  59.  
  60. } else
  61. vector.add(dir);
  62. }
  63.  
  64. /*LISTAR SOLO CARPETAS SIN SUBDIRECTORIOS*/
  65.  
  66. public ArrayList<File> listarCarpetasSinRepeticion(File dir) {
  67. vector.clear();
  68. listarCSR(dir);
  69. return vector;
  70. }
  71. private void listarCSR(File dir) {
  72. if (dir.isDirectory())
  73. {
  74. vector.add(dir);
  75. String[] children = dir.list();
  76. for (int i = 0; i < children.length; i++)
  77. if(new File(dir, children[i]).isDirectory())
  78. vector.add(new File(dir, children[i]));
  79. } else
  80. vector.add(dir);
  81. }

Este código funciona perfectamente y lo que hace es guardar los Files en un ArrayList en lugar de imprimirlo por pantalla (y de ese modo poder obtener de forma rápida del File, del parent path y del file name).
Tengo también el código donde guardo toda esa info en un fichero donde además tabulo los archivos dentro de directorios creando una estructura de árbol como dices. El único detalle es que lo implementé hace muchísimo tiempo y es un poco desastre el código además de contener interfaz gráfica medio incrustado por el código.
Ahora que conozco el modelo vista controlador vuelvo a mis inicios y cuando veo mis códigos me doy cierta vergüenza xD


Título: Re: Listado recursivo
Publicado por: zaico en 30 Abril 2012, 00:23 am
Gracias Proteus , no he dicho nada hasta ahora por que ya finalizo el plazo y la verdad es que por muchas vueltas que le di no consegui sacarlo, aún asi gracias, el unico problema es que aún no trabajamos con vectores y habia que sacarlo unicamente con los tipos de elementos que ves en codigo. Cuando cuelgue la solución la cuelgo aqui ;) gracias!