转载自 超级大柱子(简书)
go极简教程 阅读目录
Go 文件操作
- os库:文件\文件夹创建,读取,移动,复制
- io库 : 文件内容的写入,修改,拼接
基本文件操作
文件内容的读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package main
import (
"io/ioutil"
"log"
)
func main() {
// 读取文件内容
file, _ := os.OpenFile("./demo_unicode.html", 2, 0666)
fileByte1, _ = ioutil.ReadAll(file);
// 读取文件内容,更简易的方法
fileByte2, _ := ioutil.ReadFile("./demo_unicode.html")
// byte转string
fileString := string(fileByte2)
log.Println(fileString)
}
|
文件的常规操作,复制以下代码进main.go, 执行后看看效果, 再逐行阅读代码
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package main
import (
"io"
"os"
)
func main() {
// 设定工作路径, 一般在项目刚开始设定一次即可, 不要在异步过程中修改工作路径
// 默认是程序执行的路径
os.Chdir("./")
// 创建文件夹
os.MkdirAll("./aa/bb/c1", 0777) //os.ModePerm 就是0777
os.MkdirAll("./aa/bb/c2", 0777)
// 创建文件
os.Create("./aa/bb/c1/file.go")
// 移动文件
os.Rename("./aa/bb/c1/file.go", "./aa/bb/c2/file.go")
// 打开文件,得到一个 *File 对象, 用于后续的写入
file, _ := os.OpenFile("./aa/bb/c2/file.go", 2, 0666)
// 写入文件内容
io.WriteString(file, `
package main
func main(){
log.Println("我是由程序写入的代码")
}
`)
// 也可以直接调用file里的函数写入内容
file.WriteString("add string")
// 拷贝文件, 拷贝其实就是创建一个文件, 然后写入文件内容
src1, _ := os.Create("./aa/bb/c1/file-copy1.go")
io.Copy(file, src1) // 把文件file, 写入src1文件
// 删除文件或文件夹
os.Create("./aa/bb/c1/file-delete.go") // 创建一个文件用于删除
os.RemoveAll("./aa/bb/c1/file-delete.go")
}
|
文件覆盖判断 os.IsNotExist
当文件已存在时, 不管是os.Rename()
, os.Create()
, 还是io.WriteString()
都会对已存在的文件进行覆盖\修改,
如果需要安全的执行, 可以使用 os.Stat()
配合 os.IsNotExist()
做判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package main
import (
"io"
"os"
)
func main() {
os.MkdirAll("aa", 0777)
// 创建了文件 testA, 并且写入了内容
testA, _ := os.Create("aa/testA")
io.WriteString(testA, "the teatA")
// 如果需要安全判断, 可以使用 os.Stat 配合 os.IsNotExist
if _, err := os.Stat("aa/testA"); os.IsNotExist(err) {
// 当文件不存在, 才执行创建
os.Create("aa/testA")
}
os.Chmod("aa/testA", 0777)
}
|
遍历文件夹
遍历文件夹可以使用 ioutil库 的ioutil.ReadDir, 会得到一个数组, 数组元素有文件的属性,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package main
import (
"io/ioutil"
"log"
)
func main() {
fs, _ := ioutil.ReadDir("aa")
for _, v := range fs {
// 遍历得到文件名
log.Println(v.Name())
log.Println(v.IsDir())
}
}
|
权限
可以使用 os.Chmod()
修改文件权限
1
2
|
// 所有人可读写权限
os.Chmod("aa/testA", 0666)
|
1
2
|
// 只读权限
os.Chmod("aa/testA", 0400)
|
Linux权限参考
1
2
3
4
5
6
7
|
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
|