文件操作的大多数函数都是在os包里面 ## 目录操作 **创建目录** ``` func Mkdir(name string, perm FileMode) error ``` 创建名称为name的目录,权限设置是perm,例如0777。 ``` package main import ( "fmt" "os" ) func main(){ err := os.Mkdir("readme", 0777) if err != nil{ fmt.Println(err) } } // 当目录存在时报错: // mkdir readme: Cannot create a file when that file already exists. ``` **创建多级目录** ``` func MkdirAll(path string, perm FileMode) error ``` 根据path创建多级子目录 ``` package main import ( "fmt" "os" ) func main(){ // 目录存在不会报错 err := os.MkdirAll("readme/first/second", 0777) if err != nil{ fmt.Println(err) } } ``` **删除目录/文件** ``` func Remove(name string) error ``` 删除名称为name的目录,当目录下有文件或者其他目录会出错。 ``` package main import ( "fmt" "os" ) func main(){ err := os.Remove("readme") if err != nil{ fmt.Println(err) } } // 删除不为空的目录:remove readme: The directory is not empty. ``` **删除多级目录** ``` func RemoveAll(path string) error ``` 删除path(包括)及其下级子目录。 ``` package main import ( "fmt" "os" ) func main(){ err := os.RemoveAll("readme") if err != nil{ fmt.Println(err) } } ``` ## 文件操作 **创建文件** ``` func Create(name string) (file *File, err Error) ``` 根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666的文件,返回的文件对象是可读写的 ``` package main import ( "fmt" "os" ) func main(){ file, err := os.Create("readme.txt") if err != nil{ fmt.Println(err) } fmt.Println(file) // &{0xc0000cc780} } ``` 如果文件已经存在则会删除源文件重新创建 **打开文件** ``` func OpenFile(name string, flag int, perm uint32) (file *File, err Error) ``` 打开名称为name的文件,flag是打开的方式:只读、读写等,perm是权限。 flag 标签如下 ``` const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件 O_RDWR int = syscall.O_RDWR // 读写模式打开文件 O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在 O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件 ) ``` ``` func Open(name string) (file *File, err Error) ``` 该方法打开一个名称为name的文件,但是只读方式,内部实现调用了OpenFile。 **写文件** 写入byte类型的信息到文件 ``` func (file *File) Write(b []byte) (n int, err Error) ``` 在指定位置开始写入byte类型的信息。 ``` func (file *File) WriteAt(b []byte, off int64) (n int, err Error) ``` 写入string信息到文件。 ``` func (file *File) WriteString(s string) (ret int, err Error) ``` **读文件** 读取数据到b中 ``` func (file *File) Read(b []byte) (n int, err Error) ``` 从off开始读取数据到b中。 ``` func (file *File) ReadAt(b []byte, off int64) (n int, err Error) ``` **获取文件信息** ``` package main import ( "fmt" "log" "os" ) var ( fileInfo os.FileInfo err error ) func main() { // 如果文件不存在,则返回错误 fileInfo, err = os.Stat("index.html") if err != nil { log.Fatal(err) } fmt.Println("文件名称:", fileInfo.Name()) fmt.Println("文件大小:", fileInfo.Size()) fmt.Println("文件权限:", fileInfo.Mode()) fmt.Println("最后修改时间:", fileInfo.ModTime()) fmt.Println("是否是目录: ", fileInfo.IsDir()) } ``` 打印结果 ``` 文件名称: index.html 文件大小: 2677 文件权限: -rw-rw-rw- 最后修改时间: 2021-03-11 19:25:20.0098714 +0800 CST 是否是目录: false ``` 移动和重命名 ``` package main import ( "log" "os" ) func main() { originalPath := "index.html" newPath := "test/index.html" // 移动到同一目录下为重命名 err := os.Rename(originalPath, newPath) if err != nil { log.Fatal(err) } } ``` **判断文件是否存在** ``` package main import ( "fmt" "log" "os" ) func main() { // 文件不存在则返回error fileInfo, err := os.Stat("./index2.html") if err != nil { if os.IsNotExist(err) { log.Fatal("File does not exist.") } } fmt.Println("File does exist. File information:") fmt.Println(fileInfo) } ```