github.com/orangebees/go-oneutils@v0.0.10/PathHandle/func.go (about)

     1  package PathHandle
     2  
     3  import (
     4  	"crypto/sha512"
     5  	"errors"
     6  	"github.com/cespare/xxhash/v2"
     7  	"github.com/orangebees/go-oneutils/Convert"
     8  	"github.com/orangebees/go-oneutils/Random"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  )
    13  
    14  const Separator = string(filepath.Separator)
    15  const hextable = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    16  
    17  // RunInTempDir 在缓存目录中工作
    18  func RunInTempDir(f func(tmppath string) error) error {
    19  	p := os.TempDir() + Separator + Convert.B2S(Random.RandBytes32())
    20  	err := KeepDirExist(p)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	defer os.RemoveAll(p)
    25  
    26  	err = f(p)
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	return nil
    32  }
    33  
    34  // UnifyPathSlashSeparator 统一路径分隔符为斜杠
    35  func UnifyPathSlashSeparator(b []byte) {
    36  	for i := 0; i < len(b); i++ {
    37  		if b[i] == '\\' {
    38  			b[i] = '/'
    39  		}
    40  	}
    41  }
    42  
    43  // UnifyPathBackSlashSeparator 统一路径分隔符为反斜杠
    44  func UnifyPathBackSlashSeparator(b []byte) {
    45  	for i := 0; i < len(b); i++ {
    46  		if b[i] == '/' {
    47  			b[i] = '\\'
    48  		}
    49  	}
    50  }
    51  
    52  // UnifyPathBackLocalSeparator 统一路径分隔符为当前系统斜杠
    53  func UnifyPathBackLocalSeparator(b []byte) {
    54  	for i := 0; i < len(b); i++ {
    55  		if b[i] == '/' || b[i] == '\\' {
    56  			b[i] = filepath.Separator
    57  		}
    58  	}
    59  }
    60  
    61  // Bucket256AllocatedUseSha512  使用sha512作为hash算法为文件分配桶(256个桶下)
    62  //
    63  //	mod取自hash转换为可见字符串之后的值
    64  //	 已优化 可以被内联
    65  func Bucket256AllocatedUseSha512(fileBytes []byte) (hash string, mod string) {
    66  	sha512hash, dst, j := sha512.Sum512(fileBytes), make([]byte, 128), 0
    67  	//转为可见字符
    68  	for _, v := range sha512hash {
    69  		dst[j], dst[j+1] = hextable[v>>4], hextable[v&0x0f]
    70  		j += 2
    71  	}
    72  	//
    73  	t, hash := xxhash.Sum64(dst)%256, string(dst)
    74  	mod = string([]byte{hextable[t>>4], hextable[t%16]})
    75  	return
    76  }
    77  
    78  // KeepDirsExist  确保某些目录一定存在
    79  func KeepDirsExist(paths ...string) error {
    80  	for i := 0; i < len(paths); i++ {
    81  		err := KeepDirExist(paths[i])
    82  		if err != nil {
    83  			return err
    84  		}
    85  	}
    86  	return nil
    87  }
    88  
    89  // KeepDirExist 确保某目录一定存在
    90  func KeepDirExist(path string) error {
    91  	f, err := os.Stat(path)
    92  	if err == nil {
    93  		//存在
    94  		if f.IsDir() {
    95  			//是已经存在的目录 不处理
    96  			return nil
    97  		}
    98  		//是文件,返回错误
    99  		return errors.New("file exists instead of directory")
   100  	}
   101  	if os.IsNotExist(err) {
   102  
   103  		//不存在
   104  		err = os.MkdirAll(path, os.ModePerm)
   105  		if err != nil {
   106  			return err
   107  		}
   108  		return nil
   109  	}
   110  	//其他错误
   111  	return err
   112  }
   113  
   114  // URLToLocalDirPath uri转本地相对路径
   115  func URLToLocalDirPath(url string) string {
   116  	tmp := strings.Split(url, "://")
   117  	tmplen := len(tmp)
   118  	var tmpbytes []byte
   119  	if tmplen == 2 {
   120  		tmpbytes = append(tmpbytes, tmp[1]...)
   121  
   122  	} else {
   123  		tmpbytes = append(tmpbytes, tmp[0]...)
   124  	}
   125  	for i := 0; i < len(tmpbytes); i++ {
   126  		if tmpbytes[i] == '/' {
   127  			tmpbytes[i] = filepath.Separator
   128  		}
   129  	}
   130  	return string(tmpbytes)
   131  }
   132  
   133  // URLToLocalDirPathNoHost  uri转本地相对路径不带域名
   134  func URLToLocalDirPathNoHost(url string) string {
   135  	tmp := strings.Split(url, "://")
   136  	tmplen := len(tmp)
   137  	var tmpbytes []byte
   138  	if tmplen == 2 {
   139  		tmpbytes = append(tmpbytes, tmp[1]...)
   140  
   141  	} else {
   142  		tmpbytes = append(tmpbytes, tmp[0]...)
   143  	}
   144  	hostflag := 0
   145  	hostindex := 0
   146  	for i := 0; i < len(tmpbytes); i++ {
   147  		if tmpbytes[i] == '/' {
   148  			hostflag++
   149  			if hostflag == 1 {
   150  				hostindex = i
   151  			}
   152  			tmpbytes[i] = filepath.Separator
   153  
   154  		}
   155  	}
   156  	if hostflag == 0 {
   157  		return ""
   158  	}
   159  	return string(tmpbytes[hostindex:])
   160  }
   161  
   162  // PathExist 路径是否存在
   163  func PathExist(path string) (bool, error) {
   164  	_, err := os.Stat(path)
   165  	if err == nil {
   166  		return true, nil
   167  	}
   168  	if os.IsNotExist(err) {
   169  		return false, nil
   170  	}
   171  	return false, err
   172  }
   173  
   174  // FileExist  文件是否存在
   175  func FileExist(path string) (bool, error) {
   176  	f, err := os.Stat(path)
   177  	if err != nil {
   178  		if os.IsNotExist(err) {
   179  			return false, nil
   180  		}
   181  		return false, err
   182  	}
   183  	if f.IsDir() {
   184  		return false, errors.New("it is a Dir")
   185  	}
   186  	return true, nil
   187  }
   188  
   189  // DirExist 目录是否存在
   190  func DirExist(path string) (bool, error) {
   191  	f, err := os.Stat(path)
   192  	if err != nil {
   193  		if os.IsNotExist(err) {
   194  			return false, nil
   195  		}
   196  		return false, err
   197  	}
   198  	if !f.IsDir() {
   199  		return false, errors.New("it is a File")
   200  	}
   201  	return true, nil
   202  }