首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
I/O
Reader和Writer
理解Reader和Writer
Reader和Writer接口
Go语言的I/OAPI要解决的问题
文件读取
文件写入
文件权限与umask
一次性读写
缓冲区读写
bufio中的Reader和Writer
利用bufio实现按行读取
字符串数据源
strings.Reader解析
字节扫描器ByteScanner
按Rune读取UTF-符
bufio.Scanner的使用
扫描过程及源码解析
扫描时的最大支持
扫描时的最小容忍
编程范例——文件系统相关操作
查看文件系统
临时文件
网络编程
网络连接的本质
利用TCP实现网络通信
创建TCP连接
利用TCP连接进行消息传递
利用UDP实现网络通信
监听模式
拨号模式
总结监听模式和拨号模式
HTTP的相关操作
客户端发送HTTP请求
服务端处理HTTP请求
HTTP请求源码解析
提炼思考
数据传输过程
本地处理阶段
路由器处理阶段
目标主机处理阶段
网络地址转换(NAT)所扮演的角色
总结数据传输
编程范例——常见网络错误的产生及解决方案
模拟CLOSE_WAIT
模拟I/Otimeout
模拟read:connectionresetbypeer异常
模拟TIME_WAIT
当前位置:
首页>>
技术小册>>
深入浅出Go语言核心编程(六)
小册名称:深入浅出Go语言核心编程(六)
### 编程范例——文件系统相关操作 在Go语言中,处理文件系统是一项基础且强大的功能,它允许开发者以编程方式读取、写入、创建、删除文件和目录,以及遍历文件系统等。本章将通过一系列编程范例,深入浅出地介绍Go语言中与文件系统操作相关的核心编程技术。 #### 一、文件基本操作 ##### 1.1 打开与关闭文件 在Go中,`os`包提供了对文件系统的基本操作,包括打开和关闭文件。使用`os.Open`函数可以打开一个文件,该函数返回一个`*os.File`类型的值和一个可能的错误。 ```go package main import ( "fmt" "os" ) func main() { file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数返回前关闭文件 fmt.Println("File opened successfully") } ``` ##### 1.2 读取文件 读取文件内容可以通过多种方式实现,最直接的是使用`os.File`的`Read`方法,但更常用的是`bufio`包中的`Reader`类型,它提供了缓冲读取功能,使读取操作更高效。 ```go package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("Error reading file:", err) } } ``` ##### 1.3 写入文件 写入文件同样可以通过`os.File`的`Write`方法实现,但使用`bufio.Writer`可以提供更灵活的写入方式,如写入字符串而非字节切片。 ```go package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Create("output.txt") if err != nil { fmt.Println("Error creating file:", err) return } defer file.Close() writer := bufio.NewWriter(file) _, err = writer.WriteString("Hello, Go file system!\n") if err != nil { fmt.Println("Error writing to file:", err) return } writer.Flush() // 确保所有缓冲的输出都被写入底层writer fmt.Println("File written successfully") } ``` #### 二、目录与文件遍历 ##### 2.1 列出目录内容 使用`ioutil.ReadDir`(在Go 1.16及以前版本)或`os.ReadDir`(Go 1.16及以后)可以列出指定目录下的所有文件和目录。 ```go package main import ( "fmt" "os" "path/filepath" ) func main() { entries, err := os.ReadDir(".") if err != nil { fmt.Println("Error reading directory:", err) return } for _, entry := range entries { fmt.Println(entry.Name(), entry.IsDir()) } } ``` ##### 2.2 遍历目录树 遍历整个目录树(即递归列出所有子目录和文件)需要编写递归函数。 ```go package main import ( "fmt" "os" "path/filepath" ) func walkDir(path string) error { return filepath.Walk(path, func(path string, info os.FileInfo, err error) error { if err != nil { return err } fmt.Println(path, info.IsDir()) return nil }) } func main() { err := walkDir(".") if err != nil { fmt.Println("Error walking directory:", err) } } ``` #### 三、文件属性与权限 ##### 3.1 获取文件属性 使用`os.Stat`函数可以获取文件的详细属性,如大小、权限、修改时间等。 ```go package main import ( "fmt" "os" ) func main() { fileInfo, err := os.Stat("example.txt") if err != nil { fmt.Println("Error getting file info:", err) return } fmt.Println("File name:", fileInfo.Name()) fmt.Println("Size:", fileInfo.Size(), "bytes") fmt.Println("Mode:", fileInfo.Mode()) fmt.Println("Modification time:", fileInfo.ModTime()) } ``` ##### 3.2 修改文件权限 使用`os.Chmod`函数可以修改文件的权限。 ```go package main import ( "fmt" "os" ) func main() { err := os.Chmod("example.txt", 0644) // 设置文件权限为所有者读写,组用户读,其他用户读 if err != nil { fmt.Println("Error changing file permissions:", err) return } fmt.Println("File permissions changed successfully") } ``` #### 四、文件与目录的创建与删除 ##### 4.1 创建文件 使用`os.Create`可以创建新文件,如果文件已存在则截断为零长度。 ```go package main import ( "fmt" "os" ) func main() { file, err := os.Create("newfile.txt") if err != nil { fmt.Println("Error creating file:", err) return } defer file.Close() fmt.Println("File created successfully") } ``` ##### 4.2 创建目录 使用`os.Mkdir`可以创建新目录,如果需要递归创建多级目录,则使用`os.MkdirAll`。 ```go package main import ( "fmt" "os" ) func main() { err := os.Mkdir("newdir", 0755) // 创建新目录,设置权限 if err != nil { fmt.Println("Error creating directory:", err) return } err = os.MkdirAll("newdir/subdir", 0755) // 递归创建目录 if err != nil { fmt.Println("Error creating directory tree:", err) return } fmt.Println("Directories created successfully") } ``` ##### 4.3 删除文件与目录 使用`os.Remove`可以删除文件,而`os.RemoveAll`用于删除目录及其所有内容。 ```go package main import ( "fmt" "os" ) func main() { err := os.Remove("newfile.txt") if err != nil { fmt.Println("Error removing file:", err) return } err = os.RemoveAll("newdir") if err != nil { fmt.Println("Error removing directory:", err) return } fmt.Println("File and directory removed successfully") } ``` #### 结语 通过上述编程范例,我们系统地学习了Go语言中与文件系统操作相关的核心技术和方法,包括文件的基本操作(打开、关闭、读写)、目录与文件的遍历、文件属性与权限的管理,以及文件与目录的创建与删除等。这些技能是Go语言开发者在处理文件系统时不可或缺的基础,希望读者能够通过实践加深理解,并在实际项目中灵活运用。
上一篇:
扫描时的最小容忍
下一篇:
查看文件系统
该分类下的相关小册推荐:
Go开发基础入门
深入解析go语言
go编程权威指南(二)
深入浅出Go语言核心编程(一)
深入浅出Go语言核心编程(八)
Go Web编程(下)
Go语言从入门到实战
go编程权威指南(四)
企业级Go应用开发从零开始
GO面试指南
go编程权威指南(一)
Go语言入门实战经典