如何查找目录中最大文件的大小?

时间:2013-08-29 12:27:36

标签: java

我需要找出目录中最大文件/文件夹的大小。我是用以下方式完成的。

private static Long getSizeofLargestFile(String theRootFolder)
    {
        Long aLargestFileSize = 0L;
        File aRootDir = new File(theRootFolder);
        for (File aFile : aRootDir.listFiles())
        {
            if (aLargestFileSize < aFile.length())
            {
                aLargestFileSize = aFile.length();
            }
        }
        return aLargestFileSize / (1024 * 1024);
    }

有没有比这更好的方法?

5 个答案:

答案 0 :(得分:6)

不是真的..你必须得到所有文件的大小以找到最大的,这就是你正在做的。

我唯一建议的是回报中的分歧。如果最大文件小于1 MB,则您的方法将返回0!

答案 1 :(得分:4)

我会说而不是

return aLargestFileSize / (1024 * 1024);

跟着

return aLargestFileSize;

我会在一段时间内写下原因......

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args)
    {
        Long aLargestFileSize1 = (1024*1024)+2 + 0L;
        Long aLargestFileSize2 = (1024*1024)+ 0L;

        System.out.println("aLargestFileSize1 final is " + aLargestFileSize1/ (1024 * 1024));
        System.out.println("aLargestFileSize2 final is " + aLargestFileSize2/ (1024 * 1024));

        System.out.println("aLargestFileSize1 new is " + aLargestFileSize1);
        System.out.println("aLargestFileSize2 new is " + aLargestFileSize2);

        }
}

如果你看到输出都给出了1.但如果你有System.out.println("aLargestFileSize1 final is " + aLargestFileSize1);,那么输出就是,

aLargestFileSize1 new is 1048578
aLargestFileSize2 new is 1048576

表示第一个文件较大。

所以,只需使用实际数字作为回报。

Demo

答案 2 :(得分:2)

我看到了很多问题:

  • 首先,该部门有舍入问题(见其他答案)
  • 空根目录是否真的会返回0?考虑-1
  • 如果根目录中只有目录应返回0-1(请参阅下一点)
  • 您想要在目录上递归大小,还是要排除它们。
  • 我建议您返回最大的File而不是大小以消除歧义。

如果你不喜欢使用外部库,Commons IO有很多正确的方法可以使用SizeFileComparator和朋友做你想做的事。

你可能想要使用Commons IO的另一个原因(除了犯1024 * 1024舍入问题之外的错误)是我相信最新的将利用更新的JVM功能,它还提供递归目录大小(即最大的文件可能是另一个目录。)

如果您不想使用该库,我建议您至少查看其code以了解如何操作。

答案 3 :(得分:1)

Java 7提供了新的java.nio。*类,包括FileVisitor: http://docs.oracle.com/javase/tutorial/essential/io/walk.html

我已经使用过它们,但我不能说,哪种解决方案更好。 在我看来,你应该保留你的解决方案,因为最好阅读。

答案 4 :(得分:0)

这对我来说很好,有一些可能的改进。

首先,您似乎对浏览子目录不感兴趣。如果确实如此,我会将FileFilter传递给listFiles - 这样您就可以轻松过滤掉isFile()方法返回false的所有实例。

其次,我不会将返回值除以1024 * 1024.返回字节数,让调用者自己进行转换。原因是如果没有文件大于1024 * 1024字节,您的方法将返回0。