golang 标准库 目录操作
2023-03-02 21:58 dribs 阅读(69) 评论(0) 编辑 收藏 举报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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | package main import ( "fmt" "io/fs" "io/ioutil" "os" "path/filepath" ) //路径拼接 func example1() { p1 := "a/b" + "/" + "c/d" + "/" + "f" p2 := filepath.Join( "a/b" , "c/d" , "f" ) dir := filepath.Dir(p1) // a\b\c\d dir2 := filepath.Dir(p2) // a\b\c\d fmt.Println(dir) fmt.Println(dir2) } //路径分解 func example2() { p1 := "a/b/c/d/f/main.ini" dir, file := filepath.Split(p1) // a/b/c/d/f/ main.ini fmt.Println(dir, file) fmt.Println(filepath.Dir(p1)) // a\b\c\d\f fmt.Println(filepath.Base(p1)) // main.ini fmt.Println(filepath.Ext(p1)) //.ini fmt.Println(os.Getwd()) //当前路径 fmt.Println(os.UserHomeDir()) //家目录 } //文件存在性 func example3() { p1 := "e:/test.txt" //真实存在 _, err := os.Stat(p1) fmt.Println(err) //用os.IsExist(err)容易让人疑惑,建议使用os.IsNotExist(err)。 //true false false false fmt.Println(err == nil, os.IsExist(err), err != nil, os.IsNotExist(err)) p1 = "a/b/c/d/e" _, err = os.Stat(p1) fmt.Println(err) //用os.IsExist(err)容易让人疑惑,建议使用os.IsNotExist(err)。 //false false true tru fmt.Println(err == nil, os.IsExist(err), err != nil, os.IsNotExist(err)) } //stat和绝对路 func example4() { p1 := "/a/b/c/d/f/main.ini" dir := filepath.Dir(p1) err := os.MkdirAll(dir, os.ModePerm) //创建所有父目录 if err != nil { fmt.Println(err) return } f, err := os.Create(p1) if err != nil { fmt.Println(err) return } defer f.Close() //文件stat info, err := os.Stat(p1) if err != nil { fmt.Println(err) return } fmt.Println( info.Name(), info.IsDir(), info.Mode(), info.ModTime(), info.Size(), ) //绝对路径 fmt.Println( "=========绝对路径===========" ) fmt.Println(filepath.Abs(p1)) //E:\a\b\c\d\f\main.ini fmt.Println(filepath.IsAbs(p1)) //是否是绝对路径 false fmt.Println(filepath.Abs( "a/b" )) //取绝对路径 fmt.Println(os.Getwd()) //当前工作路径 fmt.Println(filepath.Rel( "/a/b" , "/a/b/c/d" )) //计算相对路径 c/d } //遍历 //filepath.WalkDir 和 filepath.Walk //遍历递归目录树 每遍历到一个节点,都会执行回调函数,只不过返回的参数略有不同 //都不跟踪软连接 内部都是按照字典序输出 深度优先 //ioutil.ReadDir(path) 不递归遍历当前目录 func example5() { p1 := "/a" //walkdir和walk遍历递归遍历 包含自身 filepath.WalkDir(p1, func (path string, d fs.DirEntry, err error) error { fmt.Println(path, d.IsDir(), d.Name(), err) //递归读出目录和文件 return err }) fmt.Println( "===Walk======" ) filepath.Walk(p1, func (path string, info fs.FileInfo, err error) error { fmt.Println(path, info.Name(), info.IsDir(), err) //递归读出目录和文件 return err }) fmt.Println( "=====ioutil.ReadDir=====" ) fi, err := ioutil.ReadDir(p1) if err != nil { fmt.Println(err) return } //fmt.Println(fi) for i, v := range fi { fmt.Println(i, v.Name(), v.IsDir()) // 0 b true 1 e true fmt.Println(filepath.Join(p1, v.Name())) // /a/b /a/e } } func main() { //example1() //example2() //example3() //example4() example5() } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具