Ява получить размер папки нескольких каталогов с файлом [] - PullRequest
1 голос
/ 19 ноября 2010

У меня есть какой-то код, который я нашел в сети и пытался приспособить для просмотра нескольких папок, выбранных с помощью fileChooser

public long getFolderSize(File[] selectedDirectories) {
 long foldersize = 0;

 for(int i = 0; i < selectedDirectories.length; i++){
  File[] currentFolder = selectedDirectories[i].listFiles();

  for (int q = 0; q < currentFolder.length; q++) {
   if (currentFolder[q].isDirectory()) {
    //if folder run self on q'th folder - in which case the files.length will be counted for the files inside
    foldersize += getFolderSize(currentFolder[q]);//<<the error is here 
   } else {
    //else get file size
    foldersize += currentFolder[q].length();
   }
  }
 return foldersize;
 }

}

Ошибка:1008 * Потому что я подразумеваю, что он использует Файл, а не Файл [], но я застрял на том, как это исправить

Ответы [ 3 ]

0 голосов
/ 19 ноября 2010

Просто измените сигнатуру с массива на varargs:

public static long getgFolderSize(final File... selectedDirectories){
    long foldersize = 0;
    for(final File item : selectedDirectories){
        for(final File subItem : item.listFiles()){
            if(subItem.isDirectory()){
                foldersize += getFolderSize(subItem);
            } else{
                foldersize += subItem.length();
            }
        }
    }
    return foldersize;
}

Теперь вы можете вызывать метод либо с одним или несколькими файлами, либо с массивом файлов.

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

public static void main(final String[] args) throws Exception{
    final File homeFolder = new File(System.getProperty("user.home"));
    final File[] subFolders = homeFolder.listFiles(new FileFilter(){

        private int ct = 0;

        @Override
        public boolean accept(final File pathname){
            return pathname.isDirectory() && ct++ < 5;
        }
    });
    System.out.println("Folders to check:" + Arrays.toString(subFolders));
    long accumulated = 0l;

    for(final File file : subFolders){
        accumulated += getFolderSize(file);
    }
    final long allAtOnce = getFolderSize(subFolders);
    final long withVarArgs =
        getFolderSize(subFolders[0], subFolders[1], subFolders[2],
            subFolders[3], subFolders[4]);
    System.out.println("Accumulated: " + accumulated);
    System.out.println("All at once: " + allAtOnce);
    System.out.println("With varargs: " + withVarArgs);
}

(Рассчитывает размер первых 5 папок в вашем домашнем каталоге, должен работать на всех платформах, не работает с ArrayIndexOutOfBoundException, если в вашем домашнем каталоге меньше пяти папок).

Вывод на мою машину:

Папки для проверки: [/ home / seanizer / Ubuntu One, / home / seanizer / Documents, /home/seanizer/.java, /home/seanizer/.mozilla, /home/seanizer/.evolution]
Накоплено: 1245886955
Все сразу: 1245886955
С переменными номерами: 1245886955

0 голосов
/ 19 ноября 2010

Обычно, когда я пишу свои методы, мне нравится разделять их на конкретные задачи.Поэтому в этом случае я бы написал метод:

public long getFolderSize(File directory) {
    long foldersize = 0;

    File[] currentFolder = directory.listFiles();

    for (int q = 0; q < currentFolder.length; q++) {
        if (currentFolder[q].isDirectory()) {
            //if folder run self on q'th folder - in which case the files.length will be counted for the files inside
            foldersize += getFolderSize(currentFolder[q]); 
        } else {
            //else get file size
            foldersize += currentFolder[q].length();
        }
    }
    return foldersize;
}

Затем я бы написал другой метод для обработки коллекции каталогов:

public long getFolderSize(File[] selectedDirectories) {
    long foldersize = 0;

    for(int i = 0; i < selectedDirectories.length; i++){
        folderSize += getFolderSize(selectedDirectories[i]);
    }
    return foldersize;
}

Таким образом, вы можете легкоповторно использовать методы в зависимости от ситуации (например, один каталог или коллекция) без необходимости создания массива, например, просто для помещения одного каталога.

В качестве альтернативы, вы можете оставить один метод, который принимает файлмассив и сделать рекурсию следующим образом:

public long getFolderSize(File[] directoryList) {
    long folderSize = 0;
    for (int i = 0; i < directoryList.length; i++) {
        File currentFile = directoryList[i];
        if (currentFile.isDirectory()) {
            folderSize += getFolderSize(currentFile.listFiles());
        } else {
            folderSize += currentFile.length();
        }
    }
    return folderSize;
}
0 голосов
/ 19 ноября 2010

Вы можете создать файл [] длиной один и просто добавить к нему объект File, а затем передать его для рекурсивного вызова. Это исправит ошибку, которую вы видите.

File[] tempArray = new File[1]; 
tempArray[0] = currentFolder[q]; 
foldersize += getFolderSize(tempArray); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...