在服务端操作中,经常需要对目录和文件进行操作。最常见的比如日志文件的处理。
我们需要按照日志类别分目录存放目录。
我们需要按照日期每天建立一个新的日志文件。
对于时间太过久远的日志和目录,也有需要删除的需求。
在 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)
网友评论