跳到主要內容

Find directories with specific size with Java. Recursive Function Demonstration.

The first function draft was generated by AI ChatGPT 3.5. But its comparative function was wrong and AI needed extra guidance to pinpoint that comparison of object in Java needs extra cares. Then its revised its recursive function. However the recursive function provided was still incorrect as it failed to count all the size of files and files inside the subfolders of a specific folder. Then I determined to finish it myself and here is my version.

The DirectorySizeChecker is a Java program that allows users to check the sizes of directories in their file system. The program takes in a directory path and an optional minimum size in megabytes as command line arguments, and outputs the paths and sizes of all directories that are equal to or larger than the specified size.

The program starts by setting a default minimum size of 100MB if no size argument is provided. It then checks if the correct number of arguments have been provided, and if the input directory exists and is indeed a directory.

The core functionality of the program is implemented in the listDirectories() method, which uses recursion to traverse the input directory and all its subdirectories, calculating the total size of each directory. When a directory is encountered, the method recursively calls itself on the subdirectory, and adds the size of the subdirectory to the size of the parent directory. If a file is encountered, its size is added to the size of the current directory.

It's worth noting that if a directory is encountered, the file.length() method will return 0, since directories do not have a size attribute like files do. Thus, the listDirectories() method keeps track of the total size of each directory by summing the sizes of all its files and subdirectories.

If a directory's size is greater than or equal to the minimum size, it is added to a list of directories. Finally, the program outputs the paths and sizes of all directories in the list. The sizes are converted from bytes to megabytes for readability.

Overall, the DirectorySizeChecker is a useful tool for quickly identifying large directories in a file system, which can help with disk space management and optimization.

 

You may download the code here too.

https://gist.github.com/edmundtt/b234df3865cefb87cbd588ac83977e5b


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DirectorySizeChecker {

    public static void main(String[] args) {
    	long minimumSize = 100 * 1024 * 1024; // 100M
    	System.out.println("dirsizecheck ver 0.2");
    	System.out.println("args.length:"+args.length);
    	System.out.println("Example usage 1) java -jar dirsizecheck d:/newwkspace 100");
    	System.out.println("It means finding all directories with size is bigger than 100M");
    	System.out.println("Example usage 2) java -jar dirsizecheck d:/newwkspace");
    	System.out.println("It means finding all directories with size is bigger than the default which is 100M.");

    	if (args.length > 2 || args.length==0) {
            System.out.println("Usage 1: java dirsizecheck [directory_path] [size in M]");
            System.out.println("Usage 2: java dirsizecheck [directory_path]");
            System.out.println("         It will find directory size bigger than 100M");
            return;
        }

        String inputDirectoryPath = args[0];
        if(args.length==2)
        {
        	minimumSize = Long.parseLong(args[1]) * 1024 * 1024; // 100M
        }
        
        File inputDirectory = new File(inputDirectoryPath);
        if (!inputDirectory.exists() || !inputDirectory.isDirectory()) {
            System.out.println("Invalid directory path: " + inputDirectoryPath);
            return;
        }

        List<DirectorySize> directories = new ArrayList<DirectorySize>();
        listDirectories(inputDirectory, minimumSize, directories);

        for (DirectorySize directory : directories) {
            System.out.println(directory.path + "\t" + (long) (directory.size/1024/1024));
        }
    }

    private static long listDirectories(File directory, long minimumSize, List<DirectorySize> directories) {
        long directorySize = 0;

        File[] files = directory.listFiles();
        if (files == null) {
            return 0;
        }

        for (File file : files) {
        	long folder_size=0;
            if (file.isDirectory()) {
                folder_size=listDirectories(file, minimumSize, directories);
                //System.out.println(file.getAbsolutePath()+":"+file.length());
                directorySize += folder_size;
            } else {
                directorySize += file.length();
            }
        }

        if (directorySize >= minimumSize) {
            directories.add(new DirectorySize(directory.getAbsolutePath(), directorySize));
        }
        return directorySize;
    } //end function

    
    private static class DirectorySize {
        public final String path;
        public final long size;

        public DirectorySize(String path, long size) {
            this.path = path;
            this.size = size;
        }
    }

}

留言

這個網誌中的熱門文章

Setup Tomcat HTTPS (with JDK 8 to Java 15) in 2 mins

  Setup Tomcat 9 HTTPS/SSL To have a quick view, you may see the video(s): https://www.youtube.com/watch?v=WDGoF13vhZU 1. Generate Keystore I am using JDK 15 to generate the keystore. But the steps are similar with Tomcat 6 + openjdk 8(as I have tried it before writing this doc) Use “keytool” command to create a self-signed certificate. During the keystore creation process, you need to assign a password and fill in the certificate’s details. D:\apache-tomcat-9.0.38\conf>keytool -genkey -alias tomcatks -keyalg RSA -keystore D:\apache-tomcat-9.0.38\conf\tomcatks When enter the passwords during generation, please make sure the two passwords you entered are the SAME. This is the requirement of Tomcat. Here is the abstract from Tomcat installation  Finally, you will be prompted for the key password , which is the password specifically for this Certificate (as opposed to any other Certificates stored in the same keystore file). You MUST use the same password here as was used f...

IIS connects to Tomcat. Bug in IIS URL redirect, http2

IIS connects to Web/Application Server Tomcat 9 IIS (Internet Information Server 10) on Windows 2016 server Plesk dropped support for connecting Tomcat from IIS. It is disgraceful. I was so disappointed to learn that. However, another exciting opportunity opened up as I learnt URL rewrite is powerful enough to take over the job and even with more elegant simplicity. So I gave it a try. Even without knowing many of its features, I was able to set it up that one of the sites mysub.yourdomain.com (not real domain, just as an example and I tried a few sites in my server) is pointing to a tomcat localhost at 8080. It sounds good enough. Right?   However, after setting the original site mysub.yourdomain.com for using https. All browsers in desktop platform and Android platform seemed to work. But browser in iOS version failed to open the https. After a few digging, some said in forum that it was a known bug https://stackoverflow.com/questions/49141004/ios-10-3-3-not-working-w...