2024-03-01 15:06:08 +01:00
|
|
|
// 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
|
|
|
|
}
|