2013-11-21 2 views
2

Я сделал этот простой эксперимент, чтобы перечислить все файлы/каталог в родительском каталоге. Сделал это, создав проект java в eclipse по имени «JavaProject» и класс «Temp.java» в src/com. Код, как показано ниже:isDirectory() метод return 'false' при вызове в java package 'com'

public class Temp { 
public static void main(String[] args) { 

    search("../JavaProject"); 
} 

public static void search(String dName) { 
    String[] files = new String[100]; 
    File search = new File(dName); // make file object 
    if (!search.isDirectory()) { 
     return; 
    } 
    files = search.list(); // create the list 
    for (String fn : files) {// iterate through it 
     System.out.print(" " + fn); 
     File temp = new File(fn); 
     if (temp.isDirectory()) { 
      search(fn); 
     } 
     System.out.println(); 
     } 
    } 
} 

Структура файла, как показано ниже:

  • JavaProject (реж)

    • .classpath (файл)

    • .project (файл)

    • .settings (реж)

      • org.eclipse.jdt.core.prefs (файл)
    • бен (реж)

      • ком (файл)

        • Temp.class (файл)
    • ЦСИ (реж)

      • ком (реж)

        • Temp.java (файл)

Когда я запускаю выше программу, она дает следующий результат:

.classpath 

.project 

.settings org.eclipse.jdt.core.prefs 

    bin com 

    src com 

Я не могу понять, почему он не печатает файл .java и .class файл внутри папки ком. Когда я пытаюсь отлаживать, тогда объект file в 'com' возвращает 'false' для методов isDirectory() и isFile().

+0

В какой каталог вы его используете? –

+0

Я сначала запустил его из eclipse (это будет директор JavaProject), а позже попытался запустить из cmd из каталога JavaProject. В обоих случаях я получаю одинаковые результаты. –

+0

Но когда вы запуститесь из затмения, он, конечно, работает из каталога «bin»? Итак, «../JavaProject» на самом деле не существует? Вот почему вы получаете false, возвращаемый из 'isDirectory()'. –

ответ

1

Вы можете использовать listFiles() вместо list(). См. Ниже пример:

public class Program { 

    public static void main(String args[]) throws IOException { 
     search(new File("."), 0); 
    } 

    public static void search(File file, int level) { 
     if (!file.isDirectory()) { 
      return; 
     } 

     for (File f : file.listFiles()) { 
      for (int i = 0; i < level; i++) { 
       System.out.print(" "); 
      } 
      System.out.println(f.getName()); 
      if (f.isDirectory()) { 
       search(f, ++level); 
      } 
     } 
    } 
} 
3

Когда он попадает в «COM» директории ваш код делает:

File temp = new File("com"); 

Поскольку вы не указали путь это будет принято, чтобы быть относительно текущего каталога, который не каталог содержащий «com».

Вы должны использовать что-то вроде:

File temp = new File(parent, fn); 

где parent является File объект для родительского каталога.

+6

+1. Или еще лучше: прекратите использование строк и используйте экземпляры файла везде (т. Е. Возьмите файл как аргумент и используйте 'File.listFiles()' вместо 'File.list()'). –