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 天前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
nil1 天前
记录protoc生成代码将optional改成omitepty问题
后端·go·protobuf
Way2top2 天前
Go语言动手写Web框架 - Gee第五天 中间件
后端·go
Way2top2 天前
Go语言动手写Web框架 - Gee第四天 分组控制
后端·go
Grassto2 天前
从 `go build` 开始:Go 第三方包加载流程源码导读
golang·go·go module
源代码•宸3 天前
Golang基础语法(go语言结构体、go语言数组与切片、go语言条件句、go语言循环)
开发语言·经验分享·后端·算法·golang·go
華勳全栈3 天前
两天开发完成智能体平台
java·spring·go
stark张宇4 天前
Go语言核心三剑客:数组、切片与结构体使用指南
后端·go
Aevget4 天前
智能高效Go开发工具GoLand v2025.3全新上线——新增资源泄漏分析
开发语言·ide·后端·golang·go
wwz165 天前
Dagor —— 一个高性能 DAG 算子执行框架,开箱即用!
go