github.com/sandwich-go/boost@v1.3.29/xos/hide.unix.go (about) 1 //go:build !windows 2 // +build !windows 3 4 package xos 5 6 import ( 7 "fmt" 8 "os" 9 "path/filepath" 10 "strings" 11 ) 12 13 // IsHidden 判断是否为隐藏文件 14 func IsHidden(path string) (bool, error) { 15 f, err := os.Stat(path) 16 if err != nil { 17 return false, err 18 } 19 if strings.HasPrefix(f.Name(), ".") { 20 return true, nil 21 } 22 return false, nil 23 } 24 25 func hide(path string, hidden, force bool) (string, error) { 26 isHidden, err := IsHidden(path) 27 if err != nil || hidden == isHidden { 28 return path, err 29 } 30 var newPath string 31 if hidden { 32 newPath = filepath.Join(filepath.Dir(path), "."+filepath.Base(path)) 33 } else { 34 newPath = filepath.Join(filepath.Dir(path), strings.TrimPrefix(filepath.Base(path), ".")) 35 } 36 if !force { 37 _, err = os.Stat(newPath) 38 if err == nil { 39 return path, fmt.Errorf("\"%s\" already exists\nUse the `ForceHide/ForceUnHide` to skip this check", newPath) 40 } 41 } 42 err = os.Rename(path, newPath) 43 if err != nil { 44 return path, err 45 } 46 return newPath, nil 47 } 48 49 // Hide 隐藏指定文件,返回被隐藏文件的名称 50 func Hide(path string) (string, error) { 51 return hide(path, true, false) 52 } 53 54 // ForceHide 强制隐藏指定文件,返回被隐藏文件的名称,若已存在相同名称的隐藏文件,则会被覆盖 55 func ForceHide(path string) (string, error) { 56 return hide(path, true, true) 57 } 58 59 // UnHide 取消隐藏指定文件,返回被取消隐藏文件的名称 60 func UnHide(path string) (string, error) { 61 return hide(path, false, false) 62 } 63 64 // ForceUnHide 强制取消隐藏指定文件,返回被取消隐藏文件的名称,若已存在相同名称的取消隐藏文件,则会被覆盖 65 func ForceUnHide(path string) (string, error) { 66 return hide(path, false, true) 67 }