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
}
相关推荐
喵个咪1 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
夜悊6 小时前
Go网络编程的学习代码示例:客户端/服务端(C/S)模型
go
审判长烧鸡11 小时前
【AI问答】GO代码循环返值
go
捧 花11 小时前
Eino框架记忆功能实现指南
go·agent·eino
Java陈序员12 小时前
主流数据库通吃!一款开源实用的数据库备份管理工具!
react.js·postgresql·go
云浪13 小时前
搞懂 Go WaitGroup:一篇文章彻底理解并发等待机制
后端·go
喵个咪1 天前
选择第三方IAM还是自建权限体系?中小型后台系统权限架构决策指南
后端·架构·go
喵个咪1 天前
AI重构软件开发范式:框架与脚手架为何仍是生产级开发的刚需?
架构·go·ai编程
夜悊1 天前
Go并发编程的学习代码示例:生产者消费者模型
go
久违 °2 天前
【AI-Agent】TagMatrix 数据标注工具开发
人工智能·数据分析·go·agent·数据隐私