Golang 文件操作

转载自 超级大柱子(简书)

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)  所有用户都有读、写、执行权限。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy