# golang文件操作
# 判断文件是否存在
func checkFileIsExist(filename string) bool {
var exist = true
if _, err := os.Stat(filename); os.IsNotExist(err) {
exist = false
}
return exist
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 创建空文件,打开不存在的文件
func main() {
newFile, err := os.Create("filename.suffix")
if err != nil {
log.Fatal(err)
}
defer newFile.Close()
log.Println(newFile)
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 打开文件,打开一个存在的文件对象
func main() {
// 如果仅读模式打开文件可以使用os.Open
// f, err := os.Open("filePath")
// 使用 os.OpenFile(),
// os.O_RDONLY // 只读
// os.O_WRONLY // 只写
// os.O_RDWR // 读写
// os.O_APPEND // 追加
// os.O_CREATE // 没有会创建
// os.O_TRUNC // 覆盖打开
f, err := os.OpenFile("filePath", os.O_APPEND|os.O_RDONLY, 0666)
if err != nil {
log.Fatal(err)
}
defer newFile.Close()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 读文件
func main() {
f, err := os.Open("filepath")
if err ...
defer f.CLose()
//带缓冲区的读取
reader := bufio.NewReader(f)
for {
// 按行读
// str, err := reader.ReadString("\n")
// fmt.Println(str)
// 缓冲区读取
buf := make([]byte, 1024)
n, err := reader.Read(buf) // 每次读取 1024个字节到 buf
...
if err == io.EOF {
break
}
}
// 可以直接使用 ioutil 包直接读取完整的整个文件
content, err := ioutil.ReadFile("filePath") // 不需要关闭, Close 已经被封装在内部
if err ...
fmt.Println(string(content))
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 写入 (向打开的文件写入字符串,字节)
func main() {
f, err := os.Open("filePath", os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
defer newFile.Close()
// 使用 io 包写入字符串
err := io.WriteString(f, "写入到文件内的字符串")
if err ...
// File 结构方法写入字符
n, err := f.Wirte([]bytes("写入到文件内的字符串"))
if err ...
fmt.Printf("成功写入%d个字符", n)
// File 结构方法写入字符串
n, err := f.WriteString("写入到文件内的字符串")
if err ...
fmt.Printf("成功写入%d个字符串", n)
// 使用带缓冲区的文件写入
writer := bufio.NewWriter(f)
writer.WriteString("写入到文件内的字符串")
writer.Flush() // 从缓冲区写入到文件内
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 获取文件信息
func main() {
fileInfo, err := os.Stat("test.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println("File name:", fileInfo.Name())
fmt.Println("Size in bytes:", fileInfo.Size())
fmt.Println("Permissions:", fileInfo.Mode())
fmt.Println("Last modified:", fileInfo.ModTime())
fmt.Println("Is Directory: ", fileInfo.IsDir())
fmt.Printf("System interface type: %T\n", fileInfo.Sys())
fmt.Printf("System info: %+v\n\n", fileInfo.Sys())
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 文件移动、文件重命名
func main() {
originalPath := "test.txt"
newPath := "test2.txt"
err := os.Rename(originalPath, newPath)
if err != nil {
log.Fatal(err)
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 删除文件
func main() {
err := os.Remove("test.txt")
if err != nil {
log.Fatal(err)
}
}
1
2
3
4
5
6
2
3
4
5
6
# 封装使用缓冲区的CopyFile函数
func copyFile(srcFileName,destFileName string)(int64,error){
srcFile,err := os.Open(srcFileName)
if err != nil {
return 0,err
}
defer srcFile.Close()
reader := bufio.NewReader(srcFile)
destFile,err := os.OpenFile(destFileName,os.O_CREATE|os.O_WRONLY,0666)
if err != nil {
return 0,err
}
writer := bufio.NewWriter(destFile)
defer destFile.Close()
n,err := io.Copy(writer,reader)
// 如果不调用 Flush 将会出现目标文件没有内容
writer.Flush()
return n,err
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18