go标准库中的文件操作有os包,io包,bufio包和ioutil包,可以做以下区分:
- 目录操作以及文件名相关的操作使用os包
- 文件内容操作建议优先使用ioutil包,然后是bufio包,然后是io包
一、目录操作
1、创建目录
(1)os.Mkdir:创建单个目录(要求上级目录必须存在)
- 使用说明:os.Mkdir(dirname string, perm fileMode)
- 参数说明:
- dirname为要创建的目录名
- perm为文件的模式和权限(使用os中的定义的常量os.ModeDir,os.ModeType,os.ModePerm等)
实例:
err := os.Mkdir("data/www/test/java", os.ModePerm)
if err != nil {
if os.IsExist(err) {
fmt.Println("目录已存在")
return
}
fmt.Printf("create dir failed:%s ", err)
return
}
注:这里的os.ModePerm表示目录的权限
(2)os.MkdirAll:递归创建目录
与os.Mkdir用法一样,是不过它可以递归的创建目录,如果当前创建的目录的上一级目录不存在,它也会创建
2、修改目录权限
os.Chmod:修改目录权限(类似于shell中的chmod)
- 使用说明:os.Chmod(dirname string, mode FileMode)
- 参数说明:
- dirname为目录或文件名
- mode为权限
实例:
const DIR = "data/www"
stats, err := os.Stat(DIR)
if err != nil {
fmt.Printf("get stat of %s failed:%s ", DIR, err)
return
}
fmt.Println(stats.Mode())
os.Chmod(DIR, 0644)
stats, err = os.Stat(DIR)
if err != nil {
fmt.Printf("get stat of %s failed:%s ", DIR, err)
return
}
fmt.Println(stats.Mode())
3、获取当前目录
使用说明:os.Getwd()
实例:
curDir, err := os.Getwd()
if err != nil {
fmt.Printf("get working directory failed,:%s ", err)
return
}
fmt.Println(curDir)
4、切换目录
- 使用说明:os.Chdir(newDir string)
- 参数说明:
- newDir为切换后的目录名
实例:
curDir, err := os.Getwd()
if err != nil {
fmt.Printf("get working directory failed,:%s ", err)
return
}
fmt.Printf("current directory is:%s ", curDir)
os.Chdir("data")
nowDir, err := os.Getwd()
if err != nil {
fmt.Printf("get working directory failed,:%s ", err)
return
}
fmt.Printf("current directory is:%s ", nowDir)
5、删除目录(文件)
(1)os.Remove(dirName string)
- 功能说明:删除非空目录
- 参数说明:dirName为要删除的目录
·
实例:
err := os.Remove("data/www/test/java")
if err != nil {
fmt.Printf("remove directory failed:%s ", err)
}
(2)os.RemoveAll(dirName string)
它与os.Remove用法是一样的,只不过它可以递归的删除目录,如果目录是非空的,也同时删除目录下的目录和文件
6、获取目录或文件状态信息
os.Stat
- 功能说明:获取目录或文件的状态信息
- 用法:os.Stat(filename string)
- 参数说明:
- filename为目标目录或文件
实例:
fileInfo, err := os.Stat("data/www/test/java/hello.txt")
if err != nil {
fmt.Printf("get file info failed:%s", err)
return
}
fmt.Printf("name:%s ", fileInfo.Name())
fmt.Printf("size:%d ", fileInfo.Size())
fmt.Printf("mode:%s ", fileInfo.Mode())
fmt.Printf("modTime:%s ", fileInfo.ModTime())
fmt.Println(fileInfo.IsDir())
fmt.Println(fileInfo.Sys())
7、读取目录
(1)通过os包的Readdir或Readdirnames
file.Readdir
- 功能说明:
- 用法:file.Readdir(n int)
- 参数说明:
- n为子目录或文件数(如果<0表示读取所有)
实例:
fd, err := os.Open("data/www")
if err != nil {
fmt.Printf("open directory failed:%s", err)
return
}
defer fd.Close()
//fileInfo为结构fileinfo
fileInfo, err := fd.Readdir(-1)
if err != nil {
fmt.Printf("read dir failed:%s ", err)
return
}
for _, v := range fileInfo {
fmt.Println(v.Name())
}
file.Readdirnames,功能与Readdir类似,只不过它返回的是一个包含子目录或文件的一个列表
例如:
fd, err := os.Open("data/www")
if err != nil {
fmt.Printf("open directory failed:%s", err)
return
}
defer fd.Close()
fileInfo, err := fd.Readdirnames(-1)
if err != nil {
fmt.Printf("read dir failed:%s ", err)
return
}
for _, v := range fileInfo {
fmt.Println(v)
}
(2)通过ioutil包
ioutil.Readdir
- 功能说明:与file.Readdir一样,读取目录,返回目录子目录或文件状态信息
- 用法说明:ioutil.Readdir(dirname string)
- 参数说明:
- dirname为目录名
实例:
fileInfo, err := ioutil.ReadDir("data/www")
if err != nil {
fmt.Printf("read dir failed:%s ", err)
return
}
for _, v := range fileInfo {
fmt.Println(v.Name())
}
二、针对文件名的操作
1、创建文件
- 功能说明:创建一个文件,并打开它
- 使用说明:os.Create(filename string)
- 参数说明:
- filename为创建的文件名
实例:
fd, err := os.Create("data/www/test/java/test.txt")
defer fd.Close()
if err != nil {
fmt.Printf("create file failed:%s", err)
}
fmt.Println("create file success")
返回值说明:
fd 为文件描述符
err为错误信息
2、文件重命名
- 功能说明:重命名文件,也可以认为是剪切文件(类似shell中的mv)
- 使用说明:os.Rename(oldName string, newName string)
- 参数说明:
- oldName为旧的文件名
- newName为新的文件名
实例:err := os.Rename("data/www/test/java/test.txt", "data/www/test/java/hello.txt")
if err != nil {
fmt.Printf("rename file failed:%s ", err)
}
三、针对文件内容的操作
1、读取文件内容
(1)通过os包读取
通过os.Open和file.Read来读取
func ReadByOs(filename string) {
start := time.Now()
//打开文件
fd, err := os.Open(filename)
if err != nil {
fmt.Printf("open file failed:%s ", err)
}
defer fd.Close()
//保存临时内容的缓存区
buf := make([]byte, 1024)
//保存读取内容的缓存区
chunks := make([]byte, 1024, 1024)
for {
//分片读取文件内容
count, err := fd.Read(buf)
if err != nil && err != io.EOF {
fmt.Printf("read file failed:%s ", err)
return
}
//读取的内容为0个
if count == 0 {
break
}
//将分片内容存入完整的缓存区中
chunks = append(chunks, buf[:count]...)
}
end := time.Now()
fmt.Println(string(chunks))
fmt.Println(end.Sub(start))
}
(2)通过bufio包读取
通过os.Open和bufio.NewReader和reader.Read来读取
func ReadByBufio(filename string) {
start := time.Now()
fd, err := os.Open(filename)
if err != nil {
fmt.Printf("open file failed:%s ", err)
}
defer fd.Close()
reader := bufio.NewReader(fd)
buf := make([]byte, 1024)
chunks := make([]byte, 1024, 1024)
for {
count, err := reader.Read(buf)
if err != nil && err != io.EOF {
fmt.Printf("read file failed:%s ", err)
return
}
if count == 0 {
break
}
chunks = append(chunks, buf[:count]...)
}
end := time.Now()
fmt.Println(string(chunks))
fmt.Println(end.Sub(start))
}
(3)通过io/ioutil包读取
通过ioutil.ReadFile来读取
func ReadByIoutil(filename string) {
start := time.Now()
data, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Printf("read file failed:%s ", err)
}
end := time.Now()
fmt.Println(string(data))
fmt.Println(end.Sub(start))
}
2、写文件
(1)通过os包和io包来实现写文件
- 通过os.OpenFile打开文件
- 通过io.WriteString写入文件内容
- 通过file.Close关闭文件
实例:
fd, err := os.OpenFile(filename, os.O_RDWR, os.ModePerm)
if err != nil {
fmt.Printf("open file failed:%s ", err)
return
}
defer fd.Close()
n, err := io.WriteString(fd, "writing by file.WriteString")
if err != nil {
fmt.Printf("write file failed:%s ", err)
}
fmt.Printf("共写入%d个字节 ", n)
注:os.OpenFile的第二个参数为打开的标识符O_RDWR表示可读可写的模式
(2)通过os包和bufio包实现
fd, err := os.OpenFile(filename, os.O_RDWR, os.ModePerm)
if err != nil {
fmt.Printf("open file failed:%s ", err)
return
}
defer fd.Close()
writer := bufio.NewWriter(fd)
n, err := writer.WriteString("writing by bufio.writer")
if err != nil {
fmt.Printf("write file failed:%s ", err)
}
writer.Flush()
fmt.Printf("共写入%d个字节 ", n)
(3)通过ioutil包实现
content := "writing by ioutil"
err := ioutil.WriteFile(filename, []byte(content), os.ModePerm)
if err != nil {
fmt.Printf("write file failed:%s ", err)
}