1. Walk
在windows平台 walk 的path返回路径为"\"
在linux平台 walk的path返回的路径是"/"
在linux平台walk识别不了"\\"
当路径中即包含"/" 或 "\", 则Walk第一次返回的路径中即带 "/" 和 "\"
func walk(fp string) {
filepath.Walk(fp, func(path string, info os.FileInfo, err error) error {
fmt.Println(path)
return nil
})
}
func main() {
var fp = "D:\\1"
walk(fp)
fmt.Println("-----------------------------------------------")
fp = "D:/1"
walk(fp)
}
/*
windows
.\1
1\2
1\2\3
1\2\3\4
1\2\3\4\5
1\2\3\4\5\6
1\2\3\4\5\6\7
1\2\3\4\5\6\7\8
-----------------------------------------------
./1
1\2
1\2\3
1\2\3\4
1\2\3\4\5
1\2\3\4\5\6
1\2\3\4\5\6\7
1\2\3\4\5\6\7\8
*/
/*
Linux
.\1
-----------------------------------------------
./1
1/2
1/2/3
1/2/3/4
1/2/3/4/5
1/2/3/4/5/6
1/2/3/4/5/6/7
1/2/3/4/5/6/7/8
*/
尝试方案
传入路径转化成linux路径, 即含"\" 转成"/"做统一处理
walk内部的path也转化成linux路径 (看需求, 内部需要使用到路径替换之类的)
func toLinux(basePath string) string {
return strings.ReplaceAll(basePath, "\\", "/")
}
func walk(fp string) {
var linux_path = toLinux(fp)
filepath.Walk(linux_path, func(path string, info os.FileInfo, err error) error {
fmt.Println(toLinux(path))
return nil
})
}
func main() {
var fp = ".\\1"
walk(fp)
fmt.Println("-----------------------------------------------")
fp = "./1"
walk(fp)
}
/*
Windows
./1
1/2
1/2/3
1/2/3/4
1/2/3/4/5
1/2/3/4/5/6
1/2/3/4/5/6/7
1/2/3/4/5/6/7/8
-----------------------------------------------
./1
1/2
1/2/3
1/2/3/4
1/2/3/4/5
1/2/3/4/5/6
1/2/3/4/5/6/7
1/2/3/4/5/6/7/8
*/
/*
Linux
./1
1/2
1/2/3
1/2/3/4
1/2/3/4/5
1/2/3/4/5/6
1/2/3/4/5/6/7
1/2/3/4/5/6/7/8
-----------------------------------------------
./1
1/2
1/2/3
1/2/3/4
1/2/3/4/5
1/2/3/4/5/6
1/2/3/4/5/6/7
1/2/3/4/5/6/7/8
*/
可以看到, 经此一改, 路径都统一了