zdr1p/zdr1p_golang/main.go
2023-03-11 09:22:51 -06:00

104 lines
4.1 KiB
Go
Executable File

////////////////////////////////////////////////////////////////////////////////////////////////////////////// ZDR1P_GOLANG / SOF
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package main
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IMPORTS
import (
"crypto/md5"
"fmt"
"io"
"io/fs"
"os"
"path/filepath"
)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// MD5 / MD5SUM FILE
type FileSummer struct {
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// MD5 / MD5SUM FILE
func NewFileSummer() *FileSummer {
return &FileSummer{}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// MD5 / MD5SUM FILE
func (f FileSummer) SumFile(filepath string) (string, error) {
fileToSum, err := os.Open(filepath)
if err != nil {
return "", err
}
defer fileToSum.Close()
hash := md5.New()
_, err = io.Copy(hash, fileToSum)
if err != nil {
return "", err
}
return fmt.Sprintf("%x", hash.Sum(nil)), nil
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////// PAD / STRING PADDING THE COUNTER WITH 8 ZEROS
func pad(n, x int64) string {
return fmt.Sprintf(fmt.Sprintf("%%0%dd", x), n)
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////// GLOBAL VARIABLES TO MAIN
var offset int64 ////////////////////////////////////////// OFFSET / FILE INDEX OF THE FILELIST SHOWN ON THE FAR LEFT PADDED IN 8
var ospathslash string ////////////////////// OSPATHSLASH / OS DEPENDANT VARIABLE - IF LINUX/MACOS THEN '/', IF WINDOWS THEN '\'
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// MAIN / MAIN LOOP
func main() {
var err error
err = filepath.Walk(".", func(path string, info fs.FileInfo, err error) error {
if err != nil {
fmt.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err)
return err
}
if offset == 0 {
path = ""
if os.PathSeparator == '\\' {
ospathslash = "\\"
} else {
ospathslash = "/"
}
}
offset += 1
fullpath, err := filepath.Abs("./")
if err != nil {
fmt.Printf("error: %s\n", err)
}
if !info.IsDir() {
md5summer := NewFileSummer()
md5sum, err := FileSummer.SumFile(*md5summer, path)
if err != nil {
fmt.Printf("error: %s\n", err)
}
fmt.Printf("\033[31m%s \033[90m!\033[31m %s\033[90m - \033[31m%s%s%s\033[0m\n", pad(offset, 8), md5sum, fullpath, ospathslash, path)
} else {
fmt.Printf("\033[90m%s \033[90m?\033[90m 00000000000000000000000000000000\033[90m - %s%s\033[0m\n", pad(offset, 8), fullpath, path)
}
return nil
})
if err != nil {
fmt.Printf("error walking the path %v\n", err)
return
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////// ZDR1P_GOLANG / EOF