60. 文件和目录

作者: 厚土火焱 | 来源:发表于2017-10-18 18:36 被阅读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)
    

    相关文章

      网友评论

        本文标题:60. 文件和目录

        本文链接:https://www.haomeiwen.com/subject/acmeuxtx.html