簡體   English   中英

JAVA-獲取所有子目錄的大小?

[英]JAVA - get size of all subdirectories?

具有這種子目錄:

C:\test\foo\a.dat (100kb)
C:\test\foo\b.dat (200kb)
C:\test\foo\another_dir\jim.dat (500kb)
C:\test\bar\ball.jpg (5kb)
C:\test\bar\sam\sam1.jpg (100kb)
C:\test\bar\sam\sam2.jpg (300kb)
C:\test\somefile.dat (700kb)

我想獲取所有子目錄的大小,但僅顯示頂層目錄,運行命令java DU c:\\ test應該會產生以下輸出:

DIR C:\TEST\FOO 800KB
FILE C:\TEST\SOMEFILE.DAT 700KB
DIR C:\TEST\BAR 405KB

任何幫助將是巨大的,到目前為止我的代碼很接近,但是沒有獲得預期的輸出? :/

import java.io.File;

public class DU {

public static void main(String[] args) {

    File file = new File(args[0]);

    if (file.isDirectory()) {
        File[] filesNames = file.listFiles();
        for (File temp : filesNames) {
            if (temp.isDirectory()) {
                File dirs = new File(temp.getPath());
                getDirSize(dirs);
            } else {
                System.out.println("FILE - " + temp.getPath() + " "
                        + friendlyFileSize(temp.length()));
            }
        }
    } else {
        System.out.println("THIS IS NOT A FILE LOCATION!");
    }
}   

private static long getDirSize(File dirs) {
    long size = 0;
    for (File file : dirs.listFiles()) {
        if (file.isFile())
            size += file.length();
        else
            size += getDirSize(file);
    }
    System.out.println("DIR - " + dirs+" "+ friendlyFileSize(size));
    return size;

}

public static String friendlyFileSize(long size) {
    String unit = "bytes";
    if (size > 1024) {
        size = size / 1024;
        unit = "kb";
    }
    if (size > 1024) {
        size = size / 1024;
        unit = "mb";
    }
    if (size > 1024) {
        size = size / 1024;
        unit = "gb";
    }
    return " (" + size + ")" + unit;
}
}

此代碼獲取所有子目錄的輸出,而不是顯示所有子目錄的總和並僅打印頂層目錄? 許多幫助:D

FILE - c:\test\baba.pdf  (4)mb
FILE - c:\test\babdb.txt  (67)kb
DIR - c:\test\one\oneone  (67)kb
DIR - c:\test\one  (814)kb
DIR - c:\test\two\twotwo  (322)kb
DIR - c:\test\two  (368)kb

您的要求是輸入一個文件夾,然后顯示該文件夾的所有文件(包括文件夾在內的文件)的大小。
我們定義的文件夾大小是該文件夾(包括子文件夾)中文件大小的總和。

因此,源代碼的過程如下:
(1)列出該文件夾的所有文件作為輸入。
(2)計算(1)中列出的文件大小。
(3)顯示文件類型(FILE OR DIR),在(1)中列出的文件的路徑以及在(2)中計算出的文件大小。

(1)和(3)的源代碼如下:

public static void showFileSizes(File dir) {
  File[] files = dir.listFiles(); // (1)
  long[] fileSizes = new long[files.length];
  for(int i = 0; i < files.length; i++) {
    fileSizes[i] = calculateFileSize(file[i]);//invoke the method corresponding to (2).
    boolean isDirectory = files[i].isDirectory();
    System.out.println(((isDirectory)?"DIR":"FILE") + " - " + files[i].getAbsolutePath() + friendlyFileSize(fileSizes[i]));// as (3)
  }
}

(2)的源代碼如下:

public static long calculateFileSize(File file) {
  long fileSize = 0L;
  if(file.isDirectory()) {
     File[] children = file.listFiles();
     for(File child : children) {
       fileSize += calculateFileSize(child);
     }
  }
  else {
    fileSize = file.length();
  }
  return fileSize;
}

您唯一要做的就是調用showFileSizes方法。

通過使用Java 7新的File I / O NIO.2框架(通常通過使用Files.walkFileTree(Path,Set,int,FileVisitor)方法),這非常容易。

import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
import java.util.concurrent.atomic.AtomicLong;

public class Main {

    private static class PrintFiles extends SimpleFileVisitor<Path> {

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
            if (attr.isDirectory()) {
                try {
                    System.out.format("Directory: %s, size: %d bytes\n", file, getDirSize(file));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else if (attr.isRegularFile()) {
                System.out.format("Regular file: %s, size %d bytes\n", file, attr.size());
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) {
            System.err.println(exc);
            return FileVisitResult.CONTINUE;
        }

        /**
         * Walks through directory path and sums up all files' sizes.
         * 
         * @param dirPath Path to directory.
         * @return Total size of all files included in dirPath.
         * @throws IOException
         */
        private long getDirSize(Path dirPath) throws IOException {
            final AtomicLong size = new AtomicLong(0L);

            Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    size.addAndGet(attrs.size());
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                   //just skip
                    return FileVisitResult.CONTINUE;
                }
            });

            return size.get();
        }
    }

    /**
     * Main method.
     * 
     * @param args
     */
    public static void main(String [] args) {
        Path p = Paths.get("d:\\octopress");
        try {
            Files.walkFileTree(p, EnumSet.noneOf(FileVisitOption.class), 1, new PrintFiles());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

緊跟已經完成的工作,每次遇到目錄時,都必須增加目錄大小。

for (File temp : filesNames) {
                if (temp.isDirectory()) {
                    dirs = new File(temp.getPath());
                    heavy += getDirSize(dirs);
                } else {
                    System.out.println("FILE - " + temp.getPath() + " "
                            + friendlyFileSize(temp.length()));
                }
            }

您還希望將大小與子目錄的父項相加后顯示大小

public static void main(String[] args) {
...
...
    System.out.println("DIR - " + dirs.getParent() + " "
                + friendlyFileSize(heavy));
    }

另外,您需要檢查目錄中是否有文件,否則dirs.listFiles()會導致NPE

private static long getDirSize(File dirs) {
        long size = 0;
        if (dirs != null && dirs.listFiles() != null) {
            for (File file : dirs.listFiles()) {
                if (file.isFile())
                    size += file.length();
                else
                    size += getDirSize(file);
            }
        }

        return size;

    }

您的整個代碼略有修改:

public class SubDirs {
    static long heavy;

    public static void main(String[] args) {

        File file = new File("C:\\Program Files");
        File dirs = null;

        if (file.isDirectory()) {
            File[] filesNames = file.listFiles();
            for (File temp : filesNames) {
                if (temp.isDirectory()) {
                    dirs = new File(temp.getPath());
                    heavy += getDirSize(dirs);
                } else {
                    System.out.println("FILE - " + temp.getPath() + " "
                            + friendlyFileSize(temp.length()));
                }
            }
        } else {
            System.out.println("THIS IS NOT A FILE LOCATION!");
        }

        System.out.println("DIR - " + dirs.getParent() + " "
                + friendlyFileSize(heavy));
    }

    private static long getDirSize(File dirs) {
        long size = 0;
        if (dirs != null && dirs.listFiles() != null) {
            for (File file : dirs.listFiles()) {
                if (file.isFile())
                    size += file.length();
                else
                    size += getDirSize(file);
            }
        }

        return size;

    }

    public static String friendlyFileSize(long size) {
        String unit = "bytes";
        if (size > 1024) {
            size = size / 1024;
            unit = "kb";
        }
        if (size > 1024) {
            size = size / 1024;
            unit = "mb";
        }
        if (size > 1024) {
            size = size / 1024;
            unit = "gb";
        }
        return " (" + size + ")" + unit;
    }
}

使用FileUtils.sizeOfDirectory()使它簡短而簡單。 為此,您必須導入org.apache.commons.io.FileUtils。

        if (temp.isDirectory()) {
            File dirs = new File(temp.getPath());

            System.out.println("DIR - " + dirs+" "+ friendlyFileSize(FileUtils.sizeOfDirectory(dirs)));

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM