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