¿Cómo almacenar la lista de archivos y carpetas en la lista o configurar usando Java?


Tengo un código de retorno para recuperar una lista de todas las rutas de archivo dentro de un directorio, pero solo obtengo el contenido de la última carpeta. Tengo dos carpetas, cada una tiene 3 archivos.

Aquí está mi código:

import java.io.*;
import java.util.*;

class Filedirexts 
{
    public static void main(String[] args) throws IOException
    {
        String Dirpath = "E:/Share/tstlpatches";
        String fieldirpath ="";
        File file = new File(Dirpath);
        List<String> strfilelst = new ArrayList<String>();
        strfilelst = Filedirexts.getsubdir(file);
        System.out.println(strfilelst.size());

        for(int i=0;i<strfilelst.size();i++)
        {
            fieldirpath = strfilelst.get(i);
            System.out.println("fieldirpath : "+fieldirpath);
        }
    }

    public static List<String> getsubdir(File file) throws IOException
    {
        File[] filelist = file.listFiles();
        List<String> strfileList = new ArrayList<String>();
        System.out.println("filelist" + filelist.length);

        for (int i=0; i< filelist.length ; i++)
        {
            if(filelist[i].exists())
            {
                if(filelist[i].isFile())
                {
                    file = filelist[i];
                    System.out.println( " fileeach file : "+fileeach.getAbsolutePath());
                    strfileList.add(file.getAbsolutePath());
                }
                else if (filelist[i].isDirectory())
                {
                    file = filelist[i];
                    System.out.println( " fileeach Directory : "+fileeach.getCanonicalPath());
                    strfileList = Filedirexts.getsubdir(file);
                    strfileList.add(file.getCanonicalPath().toString());
                }
            }
        }
        return strfileList;
    }
}

Esta es mi estructura de carpetas: MainPath E:\Share\tstlpatches que se usa en el propio código

E:\Share\tstlpatches\BE 
E:\Share\tstlpatches\BE\graphical
E:\Share\tstlpatches\BE\graphical\data1.txt
E:\Share\tstlpatches\BE\graphical\data2.txt
E:\Share\tstlpatches\BE\graphical\data3.txt
E:\Share\tstlpatches\BE\test 
E:\Share\tstlpatches\BE\test.txt
E:\Share\tstlpatches\BE\test.txt
E:\Share\tstlpatches\BE\test\readme.txt

Solo obtengo

E:\Share\tstlpatches\BE 
E:\Share\tstlpatches\BE\test
E:\Share\tstlpatches\BE\test.txt 
E:\Share\tstlpatches\BE\test.txt
E:\Share\tstlpatches\BE\test\readme.txt

Si uso el método normal, funciona bien, pero cuando lo uso con la lista, solo obtengo los contenidos de last carpeta.

¿Qué debo hacer para que el código funcione correctamente?



------------Respuesta------------

Su método recursivo está creando incorrectamente una nueva ArrayList en cada llamada y devolviendo este nuevo ArrayList en cada invocación. Es por eso que solo está viendo el contenido de la última llamada.

Aquí se explica cómo solucionarlo:

1) Cambie getsubdir para que sea nulo y pase la lista como parámetro.

public static void getsubdir(File file, List<String> strfileList) throws IOException
{
    File[] filelist = file.listFiles();
    System.out.println("filelist " + filelist.length);

    for (int i=0; i< filelist.length ; i++)
    {
        if(filelist[i].exists())
        {
            if(filelist[i].isFile())
            {
                file = filelist[i];
                System.out.println( " fileeach file : "+file.getAbsolutePath());
                strfileList.add(file.getAbsolutePath());
            }
            else if (filelist[i].isDirectory())
            {
                file = filelist[i];
                System.out.println( " fileeach Directory : "+file.getCanonicalPath());

                // Note: Since you want the directory first in the list, 
                // add it before the recursive call
                strfileList.add(file.getCanonicalPath().toString());
                Filedirexts.getsubdir(file, strfileList);
            }
        }
    }
}

2) Cambia la forma en que lo llamas desdeprincipal:

En lugar de:

strfilelst = Filedirexts.getsubdir(file);

Solo usa:

Filedirexts.getsubdir(file, strfilelst);

Etiquetas: file-handling file-io java

Artículos relacionados:

java: no se pueden enviar correos usando el servidor smtp-javamail

mongoose - Cómo obtener datos de una colección creada dinámicamente en mongoDB