Рассчитать размер каталога при повторном использовании дерева каталогов - PullRequest
0 голосов
/ 17 сентября 2018

Это мой первый пост, поэтому, пожалуйста, дайте мне знать, если я делаю что-то не так Также это домашнее задание.

Пользователь выбирает каталог / папку, и моя программа рекурсивно показывает все файлы и подкаталоги в выбранном каталоге. Программа также покажет размеры всех файлов и подкаталогов.

Я все сделал. Программа работает как положено. Тем не менее, я использовал метод FileUtils из apache.commons.io, чтобы получить размер каталога, но, видимо, мне не разрешено это делать.

Я не могу использовать apache.commons.io.

Я не могу использовать пакет Java nio.

Я не могу создать другой метод (отдельный метод), который вычисляет размер каталога. Это то, что делает это трудным.

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

У кого-нибудь есть идеи, которые могут помочь?

private void recurseDirectory(File f) {

  if (f.isFile()) { 
      show f.getAbsPath() and f.length() on GUI }

  else if (f.isDirectory()) {
      show f.getAbsPath() and FileUtils.sizeOfDirectory(f) on GUI }

      File[] files = f.listFiles();
      for (File file : files) { 
          recurseDirectory(file); }     
}

Таким образом, вместо FileUtils.sizeOfDirectory(f), в этой части кода я хотел бы начать добавлять сумму всех файлов в этом дереве каталогов и затем возвращать это.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Я смог заставить это работать, создав внутренний класс внутри метода внешнего класса.И внутри этого внутреннего класса я создал метод, который вычисляет размер каталога.Я знаю, что это не идеально, но это было домашнее задание с множеством ограничений.Рад, что это работает.

OuterClass -> recursionMethod () -> InnerClass -> getDirSizeMethod ()

Class ListDirectory {

   private void recurseDirectory(File f) {

       class InnerClass {

           private long recurseFolder(File f) {
              long folderLength = 0;
              File[] files = f.listFiles();
              for (File file : files) {

                 if (file.isFile()) 
                     { folderLength += file.length(); }

                 else if (f.isDirectory()) 
                     { folderLength += recurseFolder(file); }   
              }
              return folderLength;
          }
      }

    if (f.isFile()) 
        { show f.getAbsolutePath() and f.length() on GUI }

    else if (f.isDirectory()) {

       InnerClass inner = new InnerClass();
       long dirSize = inner.recurseFolder(f);

       show f.getAbsolutePath() and FileUtils.sizeOfDirectory(f) on GUI }

       File[] files = f.listFiles();
       for (File file : files) 
         { recurseDirectory(file); }     
    }
 }
0 голосов
/ 18 сентября 2018
private long recurseDirectory(File file) {
    if(file.isFile()){
        System.out.println(file.getAbsolutePath() + " - " + file.length());
        return file.length();
    } else if (file.isDirectory()) {
        long size = 0;
        File[] files = file.listFiles();
        for (File f : files) {
            size += recurseDirectory(f);
        }
        System.out.println(file.getAbsolutePath() + " - " + size);
        return size;

    }
    return 0;
}
0 голосов
/ 17 сентября 2018

Вы можете сделать другой метод для расчета размера, который также будет рекурсивным

private void recurseDirectory(File file) {
    System.out.println(file.getAbsolutePath() + " - " + size(file));
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        for (File f : files) {
            recurseDirectory(f);
        }
    }
}

private long size(File file) {
    if(file.isFile()){
        return file.length();
    } else if(file.isDirectory()){
        long size = 0;
        File[] files = file.listFiles();
        for (File f : files) {
            size += size(f);
        }
        return size;
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...