Получить размер папки или файла - PullRequest
96 голосов
/ 27 января 2010

Как я могу получить размер папки или файла в Java?

Ответы [ 14 ]

3 голосов
/ 27 января 2010

File.length() ( Javadoc ).

Обратите внимание, что это не работает для каталогов или не гарантируется.

Для каталога, что вы хотите? Если это общий размер всех файлов под ним, вы можете рекурсивно обойти детей, используя File.list() и File.isDirectory() и суммировать их размеры.

0 голосов
/ 31 марта 2017

в Linux, если вы хотите сортировать каталоги, тогда du -hs * | сортировать -h

0 голосов
/ 21 января 2017

После долгих исследований и изучения различных решений, предлагаемых здесь, в StackOverflow. Я наконец решил написать свое собственное решение. Моя цель состоит в том, чтобы иметь механизм безбрасывания, потому что я не хочу аварийно завершать работу, если API не может получить размер папки. Этот метод не подходит для многопоточного сценария.

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

private static boolean isValidDir(File dir){
    if (dir != null && dir.exists() && dir.isDirectory()){
        return true;
    }else{
        return false;
    }
}

Во-вторых, я не хочу, чтобы мой рекурсивный вызов входил в символические ссылки (программные ссылки) и включал размер в общую совокупность.

public static boolean isSymlink(File file) throws IOException {
    File canon;
    if (file.getParent() == null) {
        canon = file;
    } else {
        canon = new File(file.getParentFile().getCanonicalFile(),
                file.getName());
    }
    return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
}

Наконец, моя рекурсивная реализация для извлечения размера указанного каталога. Обратите внимание на нулевую проверку для dir.listFiles (). Согласно javadoc, существует вероятность того, что этот метод может вернуть ноль.

public static long getDirSize(File dir){
    if (!isValidDir(dir))
        return 0L;
    File[] files = dir.listFiles();
    //Guard for null pointer exception on files
    if (files == null){
        return 0L;
    }else{
        long size = 0L;
        for(File file : files){
            if (file.isFile()){
                size += file.length();
            }else{
                try{
                    if (!isSymlink(file)) size += getDirSize(file);
                }catch (IOException ioe){
                    //digest exception
                }
            }
        }
        return size;
    }
}

Немного крема на торте, API для получения размера списка файлов (может быть все файлы и папки в корневом каталоге).

public static long getDirSize(List<File> files){
    long size = 0L;
    for(File file : files){
        if (file.isDirectory()){
            size += getDirSize(file);
        } else {
            size += file.length();
        }
    }
    return size;
}
0 голосов
/ 05 октября 2014
public long folderSize (String directory)
    {
        File curDir = new File(directory);
        long length = 0;
        for(File f : curDir.listFiles())
        {
            if(f.isDirectory())
            {               
                 for ( File child : f.listFiles()) 
                 {
                     length = length + child.length();
                 }

                System.out.println("Directory: " + f.getName() + " " + length + "kb");
            }
            else
            {
                length = f.length();
                System.out.println("File: " + f.getName() + " " + length + "kb");
            }
            length = 0;
        }
        return length;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...