16. Go极简教程 文件\文件夹创建,读取,移动,复制,写入,遍历

Go语言给予了非常实用的文件操作, 大体分为两部分:

os库 : 文件\文件夹创建,读取,移动,复制

io库 : 文件内容的写入,修改,拼接

基本文件操作

文件内容的读取

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, 执行后看看效果, 再逐行阅读代码

package main

import (
    "io"
    "os"
)

func main() {
    // 设定工作路径, 一般在项目刚开始设定一次即可, 不要在异步过程中修改工作路径
    // 默认是程序执行的路径
    os.Chdir("./")

    // 创建文件夹
    os.MkdirAll("./aa/bb/c1", 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() 做判断

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, 会得到一个数组, 数组元素有文件的属性,

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() 修改文件权限

// 所有人可读写权限
os.Chmod("aa/testA", 0666)
// 只读权限
os.Chmod("aa/testA", 0400)

Linux权限参考:

-rw------- (600)      只有拥有者有读写权限。
-rw-r--r-- (644)      只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700)     只有拥有者有读、写、执行权限。
-rwxr-xr-x (755)    拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711)    拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666)   所有用户都有文件读、写权限。
-rwxrwxrwx (777)  所有用户都有读、写、执行权限。

Go极简教程 继续阅读( 目录)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,033评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 今天说说跟刘林林上的试听课! 先说美术课,美术班能打动我首先在于每次五十分钟的课,都能让孩子画完一个作品,而...
    我是宋小雷阅读 467评论 0 1
  • 1 王美丽和李小帅的故事 王美丽和李小帅是一对热恋中的情侣,王美丽很爱很爱李小帅,李小帅呢?口头上也很爱王美丽。 ...
    彬彬有理彬公子阅读 369评论 0 0
  • ubuntu linux用了很久,可是对终端下的字体一直不是很满意,今天终于找到了一些比较好看的终端字体,尤其是d...
    Devid阅读 7,699评论 3 2