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  }