Получение размера папки в Java возвращает отрицательный длинный - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь получить длину (размер файла) каталога, и я сделал следующий рекурсивный метод для этого, только я получаю некоторые очень странные результаты, когда я передаю new File("C:\\Users\\UserName\\Desktop") в качестве параметра.

static long totalLength = 0;

// Method to get the size of a folder and its contents
private static long getFolderSize(File folder){
    if(folder.isDirectory()){
        File[] contents = folder.listFiles();
        for(File current : contents){
            if(current.isDirectory()){
                totalLength = totalLength +getFolderSize(current);
            }
            totalLength = totalLength + current.length();
        }
    }
    return totalLength;
} 

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

Любые идеи будут оценены! Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 28 января 2012

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

У которого также есть тесты для таких случаев.

3 голосов
/ 28 января 2012

Вам не хватает блока else {} в операторе isDirectory() if.В результате вы звоните File.length() в каталог, который не указан в соответствии с документацией.Возможно, он возвращает отрицательное значение.

Документация по File.length() здесь: http://docs.oracle.com/javase/6/docs/api/java/io/File.html#length()

Ваш код, вероятно, должен выглядеть так:

0 голосов
/ 28 января 2012

Я думаю, что это лучше стилистически:

    private static long getFolderSize(File f) {
        if(!f.isDirectory()) return f.length();
        long totalLength = 0;
        for (File current : f.listFiles()) {
            totalLength += getFolderSize(current);
        }
        return totalLength;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...