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 }