it-roy-ru.com

Как вывести список файлов в текущем каталоге?

Я хочу иметь возможность перечислить файлы в текущем каталоге. Я сделал что-то, что должно работать, но не возвращает все имена файлов.

File dir = new File(".");
File[] filesList = dir.listFiles();
for (File file : filesList) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}

Он возвращает .classpath, но я вполне уверен, что в этой папке есть другие файлы Java. Может быть, точечная запись для текущей папки неверна?

25
Martynogea

Может быть, точечная запись для текущей папки неверна?

Выведите результат File.getCanonicalFile() , чтобы проверить путь. 

Может кто-нибудь объяснить мне, почему src не является текущей папкой? 

Ваш IDE устанавливает путь к классу при вызове JVM.

НАПРИМЕР. (тянется к Netbeans) Если вы выбираете меню File | Project Properties (all classes) вы можете увидеть что-то похожее на:

Netbeans project options

Это Working Directory, который представляет интерес здесь.

9
Andrew Thompson

Попробуйте это, чтобы получить все файлы внутри папки и подпапки

public static void main(String[]args)
    {
        File curDir = new File(".");
        getAllFiles(curDir);
    }
    private static void getAllFiles(File curDir) {

        File[] filesList = curDir.listFiles();
        for(File f : filesList){
            if(f.isDirectory())
                getAllFiles(f);
            if(f.isFile()){
                System.out.println(f.getName());
            }
        }

    }

Извлекать только файлы/папки

public static void main(String[]args)
    {
        File curDir = new File(".");
        getAllFiles(curDir);
    }
    private static void getAllFiles(File curDir) {

        File[] filesList = curDir.listFiles();
        for(File f : filesList){
            if(f.isDirectory())
                System.out.println(f.getName());
            if(f.isFile()){
                System.out.println(f.getName());
            }
        }

    }
22
Sach

Вы должны убедиться, что new File(".") действительно указывает на то, куда, по вашему мнению, он указывает - .classpath указывает на корень некоторого проекта Eclipse ....

3
Gyro Gearless

Быстро обыскал это, но похоже, это должно сработать. Я еще не проверял это все же.

    File f = new File("."); // current directory

    File[] files = f.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            System.out.print("directory:");
        } else {
            System.out.print("     file:");
        }
        System.out.println(file.getCanonicalPath());
    }
2
Crispy91

В вашем коде нет ничего плохого. В нем должны быть перечислены все файлы и каталоги, непосредственно содержащиеся в назначенном каталоге.

Проблема, скорее всего, одна из следующих:

  • Каталог "." - это не то, что вы ожидаете. Путь "." фактически означает «текущий каталог» или «рабочий каталог» для JVM. Вы можете проверить, что это за каталог ".", распечатав dir.getCanonicalPath().

  • Вы неправильно понимаете, что возвращает dir.listFiles(). Он не возвращает все объекты в дереве под dir. Он возвращает только те объекты (файлы, каталоги, символические ссылки и т.д.), Которые непосредственно в dir.

Файл ".classpath" предполагает, что вы просматриваете каталог проекта Eclipse, а проекты Eclipse обычно / конфигурируются с файлами Java в подкаталоге, таком как "./src". Я не ожидал бы увидеть какой-либо исходный код Java в каталоге ".".


Может кто-нибудь объяснить мне, почему src не является текущей папкой? "

Предполагая, что вы запускаете приложение в Eclipse, текущая папка по умолчанию в каталоге проекта. Вы можете изменить текущий каталог по умолчанию через одну из панелей в мастере настройки Launcher.

1
Stephen C

Ваш код дает ожидаемый результат, если вы компилируете и запускаете свой код автономно (из командной строки). Так как в Eclipse для каждого проекта по умолчанию рабочим каталогом является каталог проекта, поэтому вы получаете этот результат.

Вы можете установить свойство user.dir в Java как:

   System.setProperty("user.dir", "absolute path of src folder");

тогда это даст ожидаемый результат.

0
avinesh

Я использовал этот ответ с моим локальным каталогом (например, E://), он отлично работал для первого каталога, а для каталога secondde вывод сделал исключение нулевого указателя Java, после поиска причины, по которой я обнаружил, что проблема была создана скрытым каталог, и этот каталог был создан Windows , чтобы избежать этой проблемы, просто используйте это 

public void recursiveSearch(File file ) {
 File[] filesList = file.listFiles();
    for (File f : filesList) {
        if (f.isDirectory() && !f.isHidden()) {
            System.out.println("Directoy name is  -------------->" + f.getName());
            recursiveSearch(f);
        }
        if( f.isFile() ){
            System.out.println("File name is  -------------->" + f.getName());
        }
    }
}
0
Yagami Light