utils/file-util.go

120 lines
2.7 KiB
Go
Raw Permalink Normal View History

// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
2024-02-16 15:51:28 +01:00
// file_util.go
package utils
import (
"errors"
"fmt"
"io"
"os"
"strconv"
"strings"
)
func FileSize(filePath string) (size int64) {
info, err := os.Stat(filePath)
if err == nil {
size = info.Size()
} else {
size = -1
}
return
}
func IsRegularFile(filePath string) bool {
if filePath != "" {
info, err := os.Stat(filePath)
// return (err == nil || os.IsExist(err)) && info.Mode().IsRegular()
return (err == nil || errors.Is(err, os.ErrExist)) && info.Mode().IsRegular()
}
return false
}
func IsDirectory(filePath string) bool {
if filePath != "" {
info, err := os.Stat(filePath)
return (err == nil || errors.Is(err, os.ErrExist)) && info.Mode().IsDir()
}
return false
}
func IsSymLink(filePath string) bool {
if filePath != "" {
info, err := os.Stat(filePath)
return (err == nil || errors.Is(err, os.ErrExist)) && (info.Mode()&os.ModeSymlink != 0)
}
return false
}
func IsSymLinkByDirEntry(e os.DirEntry) bool {
info, _ := e.Info()
return info.Mode()&os.ModeSymlink != 0
}
func StreamIsTerminal(fh *os.File) bool {
var isTerminal bool = false
if fh != nil {
fi, _ := fh.Stat()
isTerminal = (fi.Mode() & os.ModeCharDevice) != 0
}
return isTerminal
}
/*
* Ispirata a https://stackoverflow.com/a/50741908
*/
func MoveFile(sourcePath, destPath string) (int64, error) {
var size int64 = 0
err := os.Rename(sourcePath, destPath)
if err != nil {
inputFile, err := os.Open(sourcePath)
if err != nil {
return 0, fmt.Errorf("Couldn't open source file: %s", err)
}
outputFile, err := os.Create(destPath)
if err != nil {
inputFile.Close()
return 0, fmt.Errorf("Couldn't open dest file: %s", err)
}
defer outputFile.Close()
size, err = io.Copy(outputFile, inputFile)
inputFile.Close()
if err != nil {
return 0, fmt.Errorf("Writing to output file failed: %s", err)
}
// The copy was successful, so now delete the original file
err = os.Remove(sourcePath)
if err != nil {
return 0, fmt.Errorf("Failed removing original file: %s", err)
}
}
return size, nil
}
func ParseMemSize(s string) (size int64, err error) {
const MULTIPLES = "BKMGTP"
// s = strings.TrimSpace(s)
if len(s) != 0 {
s = strings.ToUpper(s)
s = strings.ReplaceAll(s, ".", "")
s = strings.ReplaceAll(s, ",", "")
s = strings.ReplaceAll(s, " ", "")
pos := strings.IndexAny(s, MULTIPLES)
if pos >= 0 {
size, err = strconv.ParseInt(s[0:pos], 10, 64)
mul := strings.IndexByte(MULTIPLES, s[pos])
for ; mul > 0; mul-- {
size = size * 1_000
}
} else {
size, err = strconv.ParseInt(s, 10, 64)
}
} else {
err = errors.New("Empty string")
}
return
}