Listing Files in a Directory with Their Sizes Using Go

Listing Files in a Directory with Their Sizes Using Go
Photo by lucas Oliveira / Unsplash

File management is a common task in software development, and Go provides an efficient way to work with directories and files. In this article, we'll explore how to create a Go program that lists all files in a directory along with their sizes. We'll also discuss key considerations and additional features you can implement to enhance the program.

Core Implementation: Listing Files and Their Sizes

Here's a simple Go program to list files in a directory and display their names and sizes:

package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	// Specify the directory to scan
	directory := "./" // Change this to your desired directory path

	// Open the directory
	dir, err := os.Open(directory)
	if err != nil {
		log.Fatalf("Failed to open directory: %v", err)
	}
	defer dir.Close()

	// Read the directory contents
	files, err := dir.Readdir(-1)
	if err != nil {
		log.Fatalf("Failed to read directory: %v", err)
	}

	// Iterate through the files and display name and size
	fmt.Printf("Files in directory: %s\n", directory)
	for _, file := range files {
		if !file.IsDir() {
			fmt.Printf("Name: %s, Size: %d bytes\n", file.Name(), file.Size())
		}
	}
}

Key Points

  1. Open the Directory: The os.Open() function is used to access the directory.
  2. Read Contents: The Readdir(-1) method reads all entries (files and directories) in the directory.
  3. Filter Files: Using file.IsDir(), we exclude directories from the output.
  4. Display Information: For each file, we print its name and size.
💡
Live demo here.

Enhancing the Program with Recursive Listing

If you want to list files in subdirectories as well, you can use the path/filepath package and the Walk function. Here’s the updated program:

package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"
)

func main() {
	// Specify the directory to scan
	directory := "./" // Change this to your desired directory path

	// Walk through the directory using filepath.Walk
	fmt.Printf("Files in directory: %s\n", directory)
	err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		// Check if it's a file
		if !info.IsDir() {
			fmt.Printf("Name: %s, Size: %d bytes\n", path, info.Size())
		}
		return nil
	})

	// Handle errors from filepath.Walk
	if err != nil {
		log.Fatalf("Error walking the directory: %v", err)
	}
}

Benefits of Using filepath.Walk

  • Recursive Scanning: It automatically traverses subdirectories.
  • Full Path Access: Provides the full file path, making it easier to work with nested files.
  • Error Handling: Handles errors gracefully for each file or directory.
💡
Live demo here.

Additional Considerations

1. File Permissions

Ensure your program has the necessary permissions to read the directory and its contents. Use proper error handling to detect and report permission issues.

2. Large Directories

For directories with a large number of files, filepath.Walk can be memory-intensive. Consider optimizing the program by limiting recursion depth or processing files in chunks.

3. File Filtering

You can filter files based on criteria such as extensions, size thresholds, or modification dates. For example:

if filepath.Ext(path) == ".txt" {
	fmt.Printf("Text File: %s, Size: %d bytes\n", path, info.Size())
}

4. Output Formatting

For better readability, consider formatting the output into a table or saving it to a file for later reference.

5. Error Reporting

When working with file systems, errors are common. Always log errors to help debug issues, especially for inaccessible files or directories.

Finally

Creating a Go program to list files in a directory is straightforward, but with a few enhancements, you can make it far more versatile. Using filepath.Walk, you can handle recursive directories, filter files based on criteria, and improve error handling.

By incorporating these features, you’ll have a robust file management tool that’s both efficient and scalable. Whether you’re building a one-off utility or integrating it into a larger project, Go’s file management capabilities make it an excellent choice for handling directories and files.

Support Us