CahBagus
MENU CLOSE

Go: membaca struktur direktori

penggunaan filepath.Glob("*") di golang untuk melihat file / direktori, cuma itu tidak rekursif.

Bagaimana Cara Agar Rekursif?

cara yang baru aku coba, dengan sedikit tanya tanya ai yaitu cara manual pakai os.ReadDir dan buat rekursif sendiri.

hal yang aku lakukan seperti berikut. full kode, apa adanya yang aku buat pertama kali

package main

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

func main() {
	// Cara pertama (tidak bisa rekursif)
	/*
		matches, err := filepath.Glob("*")
		if err != nil {
			panic(err)
		}
	*/

	var totalFolder, totalFile int

	getEntries(".", &totalFolder, &totalFile)

	fmt.Printf("Directories: %d | Files: %d\n", totalFolder, totalFile)
}

func getEntries(root string, totalFolder, totalFile *int) error {
	entries, err := os.ReadDir(root)

	if err != nil {
		panic(err)
	}

	for i, entry := range entries {
		if entry.IsDir() {
			*totalFolder++
			dirName := root + "/" + entry.Name()
			if err := getEntries(dirName, totalFolder, totalFile); err != nil {
				panic(err)
			}
		} else {
			*totalFile++
			info, err := entry.Info()
			if err != nil {
				panic(err)
			}

			name := root + "/" + info.Name()
			size := info.Size()
			modTime := info.ModTime().Format("2006-01-02T15:04:05")

			fmt.Printf("%d\nName: %s\nSize: %v\nModified Time: %s\n----------\n", i+1, name, size, modTime)
		}
	}

	return err
}

Cara Yang Lebih Oke

Pada saat aku tanya lagi, ternyata ada cara yang lebih baik yaitu seperti ini.

// Katanya ini cara yang paling bagus, modern, dan efisien
func caraYangPalingOke() {
	root := "." // atau folder yang mau di-scan

	err := filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error {
		if err != nil {
			return err // handle error
		}

		// Skip folder? return filepath.SkipDir

		if d.IsDir() {
			fmt.Println("📁", path)
		} else {
			info, _ := d.Info()
			fmt.Printf("📄 %s (%d bytes)\n", path, info.Size())
		}

		return nil // lanjutin traversal
	})

	if err != nil {
		panic(err)
	}
}