Go : 使用避坑指南 filepath 包(Walk)

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

*/

可以看到, 经此一改, 路径都统一了

猜你喜欢

转载自blog.csdn.net/halo_hsuh/article/details/107153651