Go目录文件路径操作

目录操作

os.ReadDir()

读取目录

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	dirs, err := os.ReadDir("./search")
	if err != nil {
		fmt.Println(err)
	}
	for _, dir := range dirs {
		fileinfo, _ := dir.Info()
		fmt.Println(fileinfo)
		fmt.Println("is_dir:", dir.IsDir(), "name:", dir.Name())
	}
}

os.Chdir()

切换目录

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	currentDir, _ := os.Getwd()
	fmt.Println("current_dir:", currentDir) // current_dir: D:\Project\test_go\test
	err := os.Chdir("./search")
	if err != nil {
		fmt.Println(err)
	}
	currentDir, _ = os.Getwd()
	fmt.Println("current_dir:", currentDir) // current_dir: D:\Project\test_go\test\search
}

os.Chmod()

修改文件或目录权限

Go 复制代码
package main

import (
	"fmt"
	"os"
)

var FileMode os.FileMode = 0400 // go的Windows权限模式不同于Linux, 0200和0600读写,0400只读

func main() {
	const FilePath = "./search/default.go"
	fileinfo, _ := os.Stat(FilePath)
	fmt.Println(fileinfo.Mode()) // -rw-rw-rw-
	err := os.Chmod(FilePath, FileMode)
	if err != nil {
		fmt.Println(err)
	}
	fileinfo, _ = os.Stat(FilePath)
	fmt.Println(fileinfo.Mode()) // -r--r--r--
}
Go 复制代码
package main

import (
	"fmt"
	"os"
)

var FileMode os.FileMode = 0400 // go的Windows权限模式不同于Linux, 0200和0600读写,0400只读

func main() {
	const FilePath = "./search"
	fileinfo, _ := os.Stat(FilePath)
	fmt.Println(fileinfo.Mode()) // drwxrwxrwx
	err := os.Chmod(FilePath, FileMode)
	if err != nil {
		fmt.Println(err)
	}
	fileinfo, _ = os.Stat(FilePath)
	fmt.Println(fileinfo.Mode()) // dr-xr-xr-x
}

os.Mkdir()

创建目录

Go 复制代码
package main

import (
	"log"
	"os"
)

var DirMode os.FileMode = 0755

func main() {
	err := os.Mkdir("test", DirMode)
	if err != nil {
		log.Print(err)
	}
}

os.MkdirAll()

递归创建目录

Go 复制代码
package main

import (
	"log"
	"os"
)

var DirMode os.FileMode = 0755

func main() {
	err := os.MkdirAll("test/test/test", DirMode)
	if err != nil {
		log.Print(err)
	}
}

os.Remove()

删除目录或文件

Go 复制代码
package main

import (
	"log"
	"os"
)

func main() {
	err := os.Remove("test/test/test")
	if err != nil {
		log.Print(err)
	}
}

os.RemoveAll()

递归删除目录

Go 复制代码
package main

import (
	"log"
	"os"
)

func main() {
	err := os.RemoveAll("test")
	if err != nil {
		log.Print(err)
	}
}

os.Rename()

目录重命名

Go 复制代码
package main

import (
	"log"
	"os"
)

func main() {
	oldName := "test"
	newName := "dir"
	err := os.Rename(oldName, newName)
	if err != nil {
		log.Fatal(err)
	}
}

文件操作

os.ReadFile()

读取文件

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	data, err := os.ReadFile("test.txt")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(data)) // hello world
}

os.WriteFile()

写文件

Go 复制代码
package main

import (
	"fmt"
	"io/fs"
	"os"
)

func main() {
	err := os.WriteFile("test.txt", []byte("hello world"), fs.ModeType)
	if err != nil {
		fmt.Println(err)
	}
}

os.Create()

创建文件

用Create()函数创建一个名为name的文件,默认采用模式0666。如果文件已存在,则它会被重置为空文件。如果成功,则返回的文件描述符对象可用于文件的读写。

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	fp, err := os.Create("./test.txt")
	if err != nil {
		fmt.Println("file create failed")
	}
	fmt.Printf("%T", fp) // *os.File
	defer fp.Close()
}

文件路径操作

filepath.Abs()

获取路径的绝对路径

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f, _ := filepath.Abs("./search")
	fmt.Println(f) // D:\Project\test_go\test\search
}

filepath.Join()

路径拼接

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f := filepath.Join("test", "search", "default.go")
	fmt.Println(f) // test\search\default.go
}

filepath.Base()

返回路径 basename

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f := filepath.Base("D:\\Project\\test_go\\test\\search")
	fmt.Println(f) // search
}

filepath.Clean()

返回路径的简洁模式

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f := filepath.Clean("./search/../data")
	fmt.Println(f) // search
}

filepath.Dir()

返回路径的上级目录

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f := filepath.Dir("./search/default.go")
	fmt.Println(f) // search
}

filepath.Ext()

返回文件的扩展名

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f := filepath.Ext("./search/default.go")
	fmt.Println(f) // .go
}

filepath.FromSlash()

路径使用系统兼容的路径连接符

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	f := filepath.FromSlash("./search/default.go")
	fmt.Println(f) // .\search\default.go
}

filepath.Split()

获取路径中的目录和文件

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	dir, file := filepath.Split("./search/default.go")
	fmt.Println(dir)  // ./search/
	fmt.Println(file) // default.go
}

filepath.Glob()

通配文件

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	files, _ := filepath.Glob("./search/*.go")
	for _, file := range files {
		fmt.Println(file)
	}
	// search\default.go
	// search\feed.go
	// search\match.go
	// search\search.go
}

filepath.IsAbs()

绝对路径判断

Go 复制代码
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	isAbs := filepath.IsAbs("./search/match.go")
	fmt.Println("isAbsDir:", isAbs) // isAbsDir: false
	abspath, _ := filepath.Abs("./search/match.go")
	fmt.Println(abspath) // D:\MyProject\Go\test\search\match.go
	isAbs = filepath.IsAbs("D:\\MyProject\\Go\\test\\search\\match.go")
	fmt.Println("isAbsDir:", isAbs) // isAbsDir: true

}

filepath.Walk()

目录遍历

Go 复制代码
package main

import (
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	root := `./test`
	err := filepath.Walk(root, scan)
	if err != nil {
		fmt.Printf("filepath.Walk() return %v\n", err)
		//scaned dir: ./test
		//scaned dir: test\test
		//scaned dir: test\test\test
		//scaned file: test\test\test\test.txt
	}
}

func scan(path string, f os.FileInfo, err error) error {
	if f.IsDir() {
		fmt.Printf("scaned dir: %s\n", path)
	} else {
		fmt.Printf("scaned file: %s\n", path)
	}
	return nil
}
相关推荐
研究司马懿3 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大17 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘1 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤1 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo