获取Java中文件夹的大小将返回负long

获取Java中文件夹的大小将返回负long,java,file,recursion,size,Java,File,Recursion,Size,我正在尝试获取目录的长度(文件大小),我使用了下面的递归方法,只是当我将新文件(“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

我正在尝试获取目录的长度(文件大小),我使用了下面的递归方法,只是当我将
新文件(“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;
} 
不过有趣的是,当我将一些文件夹传递到方法中时,它们确实返回了预期的结果。我也不知道为什么:我已经对单个文件的长度进行了一些调试,没有一个文件看起来是负的,但我有时仍然会得到负的结果


任何想法都将不胜感激!提前感谢

您在
isDirectory()
if语句中缺少一个else{}块。因此,您正在对一个目录调用
File.length()
,根据文档,该目录未指定。它很可能返回一个负值

有关
File.length()
的文档如下:

您的代码应该是:

 if(current.isDirectory()) {
    totalLength = totalLength +getFolderSize(current, initial);
  } else {
    totalLength = totalLength + current.length();
  }

isDirectory()
if语句中缺少else{}块。因此,您正在对一个目录调用
File.length()
,根据文档,该目录未指定。它很可能返回一个负值

有关
File.length()
的文档如下:

您的代码应该是:

 if(current.isDirectory()) {
    totalLength = totalLength +getFolderSize(current, initial);
  } else {
    totalLength = totalLength + current.length();
  }

为什么不使用一个已经内置了此功能的已建立的库,例如:

  • )

它也有测试来覆盖这样的情况。

为什么不使用一个已经内置了此功能的已建立库,例如:

  • )

它也有测试来覆盖这样的情况。

我认为这在风格上更好:

    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;
    }

我认为这在风格上更好:

    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;
    }


您不想在
totalLength=totalLength+current.length()
块周围使用
else
吗?上面的代码中缺少一些内容,
getFolderSize()
方法接收一个或两个参数?它超载了吗?@scarLópez我不知道你的意思。该方法没有重载,并且只有一个参数。你为什么感到困惑?@Andy看看你发布的代码:
getFolderSize()
的方法定义接收一个参数,
folder
。但是当你调用它时,你传递了两个参数,
current
initial
。另外,将结果存储在
静态long int
中是一个糟糕的主意,你永远不会在调用之间清除它(再次将其设置为零)。你不想在
totalength=totalength+current.length()周围使用
else
block?上面的代码中缺少一些内容,
getFolderSize()
方法接收一个或两个参数?它超载了吗?@scarLópez我不知道你的意思。该方法没有重载,并且只有一个参数。你为什么感到困惑?@Andy看看你发布的代码:
getFolderSize()
的方法定义接收一个参数,
folder
。但是当你调用它时,你传递了两个参数,
current
initial
。另外,将结果存储在
静态长整型中是一个糟糕的想法,你永远不会在调用之间清除它(再次将其设置为零).@ruakh-你编辑掉我输入的代码样本有什么特殊原因吗?我开始编辑时,代码样本不在那里,StackOverflow软件也没有给我任何迹象表明我的编辑与任何其他编辑冲突。@r谢谢你的回答,这可能与它有关,但即使我添加了一个else块,它仍然不起作用。我不认为这会有什么不同,因为文件夹仍然有一个长度(文件大小),不是吗?!不管怎么说,现在这并不重要,因为我知道FileUtils!再次感谢。@ruakh-您编辑掉我输入的代码样本有什么特别的原因吗?我开始编辑时,代码样本不在那里,StackOverflow软件也没有给我任何迹象表明我的编辑与任何其他编辑冲突。@r感谢您的回答,这可能与它有关,但即使我添加了一个else块,它仍然不起作用。我不认为这会有什么不同,因为文件夹仍然有一个长度(文件大小),不是吗?!不管怎么说,现在这并不重要,因为我知道FileUtils!再次感谢。回答你的问题,因为我并不真正了解FileUtils库。我现在正在使用它,它是一种享受,所以非常感谢!icyrock.com,还有一个问题。这种方法在计算大小时似乎有点慢,比如说20 GB的文件夹,所以是否有其他方法,或者我可以做些什么来加速它等等?慢不是来自文件夹的大小,而是来自子文件夹和文件的数量-如果你有20 1GB的文件,它会非常快。Windows本身需要多少时间来计算文件大小?它应该具有可比性。请注意,在第一次计算之后,如果您有足够的RAM进行缓存,则速度应该快得多。如果它对您来说仍然太慢,那么我看到的唯一其他软件解决方案就是做一些索引。在Windows上,您可以尝试使用Windows搜索(请参见示例),但这涉及的内容更多。实际上,我忘记了在Windows上建立索引,因此我没有任何东西可以与速度进行比较,但无论如何,我看不出这有多大意义。出于技术原因,正如你所说的,在速度方面我真的做不了多少,而不会对程序太过技术化,原因很简单,由于应用程序的性质,我的程序的用户不太可能选择这么大的目录。再次感谢你!回答你的问题,因为我并不真正了解FileUtils库。我现在正在使用它,它是一种享受,所以非常感谢!icyrock.com,还有一个问题。当计算一个20GB文件夹的大小时,这种方法似乎有点慢,所以有其他方法或方法吗