在上一篇文章中,我们介绍了常用的文件读写操作,今天接着来研究一下,除了读写以外的其他常见文件操作。
一、创建目录:
package main
import (
"fmt"
"os"
)
func main() {
// 创建单个目录
os.Mkdir("go", os.ModePerm)
// 创建多级目录
os.MkdirAll("go/lang", os.ModePerm)
// 返回FileInfo实例
info, _ := os.Stat("go/lang")
printFileInfo(info)
}
// 显示文件信息
func printFileInfo(info os.FileInfo) {
fmt.Printf("name: %v
", info.Name()) // 文件名
fmt.Printf("size: %v
", info.Size()) // 文件大小
fmt.Printf("mode: %v
", info.Mode()) // 文件权限
fmt.Printf("is dir: %v
", info.IsDir()) // 是否为目录类型
fmt.Printf("modify time: %v
", info.ModTime()) // 最后修改时间
}
os.Mkdir() 方法只能创建单个目录,而 os.MkdirAll() 可以创建多级目录。
最后我们使用 os.State() 方法获取目录或文件的描述对象,通过这个对象,我们可以得到目录或文件的各种常用信息。
二、检测目录或文件是否存在:
package main
import (
"fmt"
"os"
)
func main() {
path := "go/lang/test.txt"
// 返回FileInfo实例
info, err := os.Stat(path)
// 检测文件或目录是否存在
if (os.IsNotExist(err)) {
// 创建文件
os.Create(path)
// 重新获取FileInfo
info, _ = os.Stat(path)
}
printFileInfo(info)
}
// 显示文件信息
func printFileInfo(info os.FileInfo) {
fmt.Printf("name: %v
", info.Name())
fmt.Printf("size: %v
", info.Size())
fmt.Printf("mode: %v
", info.Mode())
fmt.Printf("is dir: %v
", info.IsDir())
fmt.Printf("modify time: %v
", info.ModTime())
}
如果 err 的值为 nil,则表示文件存在,可完成后续的操作。
如果要判断文件不存在,则要通过 os.isNotExist(err) 方法来检测。
三、列举目录下的所有文件:
package main
import (
"fmt"
"io/ioutil"
"path"
)
func main() {
dirPath := "go/lang"
// 利用ioutil读取目录
files, _ := ioutil.ReadDir(dirPath)
// 遍历目录
for _, fileInfo := range files {
fileName := fileInfo.Name()
// 拼接路径
filePath := path.Join(dirPath, fileName)
fmt.Println(filePath)
}
}
ioutil.ReadDir() 方法的完整签名是:func ReadDir(dirname string) ([]os.FileInfo, error),它返回一个 os.FileInfo 类型的切片,我们可以遍历这个结果,逐个处理目录下的每一个文件。
如果遍历的过程中遇到子目录,我们可以通过 fileInfo.IsDir() 来检测,如果检测结果是目录,则再进行递归调用即可。
值得一提的是,path/filepath 包提供了遍历多级目录的方法,下面我们演示一下:
package main
import (
"fmt"
"path/filepath"
"os"
)
func main() {
dirPath := "go"
filepath.Walk(dirPath, func(path string, fileInfo os.FileInfo, err error) error {
if fileInfo == nil {
return err
}
isDir := fileInfo.IsDir()
fmt.Println(path, "is dir?", isDir)
return nil
})
}
四、重命名文件:
package main
import (
"os"
)
func main() {
// 对文件重命名
os.Rename("go/lang/test.txt", "go/lang/test2.txt")
}
五、移除目录或文件:
package main
import (
"os"
)
func main() {
// 移除文件或空目录
os.Remove("go/lang/test2.txt")
// 移除文件或目录
os.RemoveAll("go")
}
os.Remove() 方法可以移除单个文件或空目录,如果想移除非空目录,则需要调用 os.RemoveAll() 方法来完成。
关于文件的操作方式还有很多,今天就先介绍到这里吧,后续有时间再补充。