Golang语言社区go学习

60. 文件和目录

2017-10-18  本文已影响97人  厚土火焱

在服务端操作中,经常需要对目录和文件进行操作。最常见的比如日志文件的处理。
我们需要按照日志类别分目录存放目录。
我们需要按照日期每天建立一个新的日志文件。
对于时间太过久远的日志和目录,也有需要删除的需求。
在 GO 语言中这些事情做起来都是轻松写意的。<(^-^)>
文件操作的大部分函数都是在 os 包中的。
因此,我们的 import 是这样的

import (
    "os"
    "fmt"
    "time"
)

目录操作

建立一个单独的目录

os.Mkdir("temp", 0777)      //建立一个目录

建立一个多级目录

os.MkdirAll("temp/temp01/temp0101", 0777)       //建立多级目录

通过上面两条语句,我们就能得到 temp 目录和一个以 temp为最上层目录的三级目录,最底层目录是 temp0101
移除目录使用的是 Remove 或 RemoveAll
Remove 移除一个目录,并且要求目录内没有其他文件或目录,否则会报错。

err := os.Remove("temp")    //移除一个目录

如果要移除多级目录,或者移除目录时目录中的文件和其他目录也要一起移除,就需要使用 RemoveAll。

os.RemoveAll("temp")        //移除多级目录

文件操作

建立一个文件使用 os.Create

    userFile := "tt.txt"
    fout, err := os.Create(userFile)

使用 fout.WriteString 或 fout.Write 写入文件内容

        fout.WriteString(time.Now().Format("2016-01-02 15:04:05.0000000")+" Shun love me.\r\n")
        fout.Write([]byte(time.Now().Format("2016-01-02 15:04:05.0000000")+" Shun love me.\r\n"))

打开文件使用 os.Open

fl, err := os.Open(userFile)

读取文件使用的是 os.Read 和 os.ReadAt
其中 os.Read 是读取完整的文件内容;os.ReadAt 可以读取某指定位置之后的内容。

buf := make([]byte, 1024)
n, _ := fl.Read(buf)
n, _ := fl.ReadAt(buf, 255)

看一个代码示例,来理解以上的内容

package main

import (
    "os"
    "fmt"
    "time"
)

//文件处理
func myfile()  {
    //*****目录处理**************************
    os.Mkdir("temp", 0777)      //建立一个目录
    os.Mkdir("temp", 0777)      //建立一个目录
    os.MkdirAll("temp/temp01/temp0101", 0777)       //建立多级目录
    err := os.Remove("temp")    //移除一个目录
    if err != nil{
        fmt.Println(err)
    }
    os.RemoveAll("temp")        //移除多级目录

    //*****文件处理***************************
    userFile := "tt.txt"
    fout, err := os.Create(userFile)
    if err != nil{
        fmt.Println(userFile, err)
        return
    }
    defer fout.Close()
    for i := 0; i < 5; i++{
        fout.WriteString(time.Now().Format("2006-01-02 15:04:05.0000000")+" Shun love me.\r\n")
        fout.Write([]byte(time.Now().Format("2006-01-02 15:04:05.0000000")+" Shun love me.\r\n"))
    }

    fl, err := os.Open(userFile)
    if err != nil{
        fmt.Println(userFile, err)
        return
    }
    defer fl.Close()
    buf := make([]byte, 1024)
    for{
        n, _ := fl.Read(buf)
        if 0 == n {
            break
        }
        os.Stdout.Write(buf[:n])
    }
    fmt.Println("--------华丽分割线---------------")
    for{
        n, _ := fl.ReadAt(buf, 255)
        if 0 == n{
            break
        }
        os.Stdout.Write(buf[:n])
        break
    }


}

运行效果如下

remove temp: The directory is not empty.
2017-10-18 18:32:25.7821575 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
--------华丽分割线---------------
.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.
2017-10-18 18:32:25.7971584 Shun love me.

需要看目录的建立和删除演示效果的,可以把其余代码注释掉,再运行即可。
如果是要在文件尾部增加内容,需要用如下语句打开

fout, err := os.OpenFile(userFile, os.O_WRONLY|os.O_APPEND, 0666)
上一篇 下一篇

猜你喜欢

热点阅读