github.com/kaydxh/golang@v0.0.131/go/path/filepath/path.go (about) 1 /* 2 *Copyright (c) 2022, kaydxh 3 * 4 *Permission is hereby granted, free of charge, to any person obtaining a copy 5 *of this software and associated documentation files (the "Software"), to deal 6 *in the Software without restriction, including without limitation the rights 7 *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 *copies of the Software, and to permit persons to whom the Software is 9 *furnished to do so, subject to the following conditions: 10 * 11 *The above copyright notice and this permission notice shall be included in all 12 *copies or substantial portions of the Software. 13 * 14 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 *SOFTWARE. 21 */ 22 package filepath 23 24 import ( 25 "path" 26 "path/filepath" 27 ) 28 29 func GetParentRelPath(filePath string) string { 30 fileName := path.Base(filePath) 31 parentDir := GetParentRelDir(filePath) 32 return filepath.Join(parentDir, fileName) 33 } 34 35 func GetParentRelDir(filePath string) string { 36 dir := path.Dir(filePath) 37 return path.Base(dir) 38 } 39 40 func LastChar(str string) uint8 { 41 if str == "" { 42 // char '0' means dec 48, 0 means null 43 return 0 44 } 45 46 return str[len(str)-1] 47 } 48 49 // join paths, keep relativePath suffix 50 func JoinPaths(rootPath, relativePath string) (string, error) { 51 absolutePath, err := filepath.Abs(rootPath) 52 if err != nil { 53 return "", err 54 } 55 56 if relativePath == "" { 57 return absolutePath, nil 58 } 59 60 finalPath := path.Join(absolutePath, relativePath) 61 if LastChar(relativePath) == '/' && LastChar(finalPath) != '/' { 62 return finalPath + "/", nil 63 } 64 65 return finalPath, nil 66 } 67 68 // CanonicalizePath turns path into an absolute path without symlinks. 69 func CanonicalizePath(path string) (string, error) { 70 path, err := filepath.Abs(path) 71 if err != nil { 72 return "", err 73 } 74 activepath, err := filepath.EvalSymlinks(path) 75 if err == nil { 76 return activepath, nil 77 } 78 79 /* 80 // Get a better error if we have an invalid path 81 if pathErr, ok := err.(*os.PathError); ok { 82 err = errors.Wrap(pathErr.Err, pathErr.Path) 83 } 84 */ 85 86 return path, nil 87 }