-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpath_windows.go
59 lines (47 loc) · 1.06 KB
/
path_windows.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package unifs
import (
"path"
"path/filepath"
"regexp"
"strings"
)
var absPathRe = regexp.MustCompile(`^[a-zA-Z]:`)
var drivePathRe = regexp.MustCompile(`^[a-zA-Z]:$`)
func absOSPath(os_name string) (string, error) {
if strings.HasPrefix(os_name, `\`) {
return "", ErrInvalid
}
if !absPathRe.MatchString(os_name) {
abs_name, err := filepath.Abs(os_name)
if err != nil {
return "", err
}
os_name = abs_name
}
if drivePathRe.MatchString(os_name) {
os_name += `\`
}
return os_name, nil
}
func toOSPath(uni_name string) (string, error) {
if len(uni_name) < 1 || uni_name[0] != '/' {
return "", ErrInvalid
}
os_name := strings.ReplaceAll(uni_name[1:], "/", `\`)
if !absPathRe.MatchString(os_name) {
return "", ErrInvalid
}
if drivePathRe.MatchString(os_name) {
os_name += `\`
}
return os_name, nil
}
func fromOSPath(os_name string) (string, error) {
abs_name, err := absOSPath(os_name)
if err != nil {
return "", err
}
os_name = abs_name
uni_name := "/" + strings.ReplaceAll(os_name, `\`, "/")
return path.Clean(uni_name), nil
}