1 Star 1 Fork 0

titan-kit/titan

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
files.go 3.17 KB
一键复制 编辑 原始数据 按行查看 历史
package files
import (
"crypto/md5"
"errors"
"fmt"
"io"
"os"
"path"
"path/filepath"
"syscall"
)
// FileInfo 描述一个配置文,由fileStat返回.
type FileInfo struct {
Uid uint32
Gid uint32
Mode os.FileMode
Md5 string
}
func AppendPrefix(prefix string, keys []string) []string {
s := make([]string, len(keys))
for i, k := range keys {
s[i] = path.Join(prefix, k)
}
return s
}
// isFileExist 报告路径是否退出.
func IsFileExist(fpath string) bool {
if _, err := os.Stat(fpath); os.IsNotExist(err) {
return false
}
return true
}
// filestat 返回描述命名文件的FileInfo.
func FileStat(name string) (fi FileInfo, err error) {
if IsFileExist(name) {
f, err := os.Open(name)
if err != nil {
return fi, err
}
defer f.Close()
stats, _ := f.Stat()
fi.Uid = stats.Sys().(*syscall.Stat_t).Uid
fi.Gid = stats.Sys().(*syscall.Stat_t).Gid
fi.Mode = stats.Mode()
h := md5.New()
_, _ = io.Copy(h, f)
fi.Md5 = fmt.Sprintf("%x", h.Sum(nil))
return fi, nil
}
return fi, errors.New("file not found")
}
// IsConfigChanged 报告src和dest配置文件是否相等.
// 当两个配置文件具有相同的文件内容和Unix权限时,它们是相等的. 所有者,组和方式必须匹配.在其他情况下返回false.
func IsConfigChanged(src, dest string) (bool, error) {
if !IsFileExist(dest) {
return true, nil
}
d, err := FileStat(dest)
if err != nil {
return true, err
}
s, err := FileStat(src)
if err != nil {
return true, err
}
if d.Uid != s.Uid {
fmt.Printf("%s has UID %d should be %d\n", dest, d.Uid, s.Uid)
}
if d.Gid != s.Gid {
fmt.Printf("%s has GID %d should be %d\n", dest, d.Gid, s.Gid)
}
if d.Mode != s.Mode {
fmt.Printf("%s has mode %s should be %s\n", dest, d.Mode, s.Mode)
}
if d.Md5 != s.Md5 {
fmt.Printf("%s has md5sum %s should be %s\n", dest, d.Md5, s.Md5)
}
if d.Uid != s.Uid || d.Gid != s.Gid || d.Mode != s.Mode || d.Md5 != s.Md5 {
return true, nil
}
return false, nil
}
func IsDirectory(path string) (bool, error) {
f, err := os.Stat(path)
if err != nil {
return false, err
}
switch mode := f.Mode(); {
case mode.IsDir():
return true, nil
case mode.IsRegular():
return false, nil
}
return false, nil
}
func RecursiveFilesLookup(root string, pattern string) ([]string, error) {
return recursiveLookup(root, pattern, false)
}
func RecursiveDirsLookup(root string, pattern string) ([]string, error) {
return recursiveLookup(root, pattern, true)
}
func recursiveLookup(root string, pattern string, dirsLookup bool) ([]string, error) {
var result []string
isDir, err := IsDirectory(root)
if err != nil {
return nil, err
}
if isDir {
err := filepath.Walk(root, func(root string, f os.FileInfo, err error) error {
match, err := filepath.Match(pattern, f.Name())
if err != nil {
return err
}
if match {
isDir, err := IsDirectory(root)
if err != nil {
return err
}
if isDir && dirsLookup {
result = append(result, root)
} else if !isDir && !dirsLookup {
result = append(result, root)
}
}
return nil
})
if err != nil {
return nil, err
}
} else {
if !dirsLookup {
result = append(result, root)
}
}
return result, nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/titan-kit/titan.git
git@gitee.com:titan-kit/titan.git
titan-kit
titan
titan
v0.0.4

搜索帮助