「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
1. FileInfo接口首先,file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。
FileInfo接口中定义了File信息相关的方法。
type FileInfo interface {
Name() string
Size() int64
Mode() FileMode
ModTime() time.Time
IsDir() bool
Sys() interface{}
}
复制代码
2. 权限
至于操作权限perm,除非创建文件时才需要指定,不需要创建新文件时可以将其设定为0。虽然go语言给perm权限设定了很多的常量,但是习惯上也可以直接使用数字,如0666(具体含义和Unix系统的一致)。
权限控制:
linux 下有2种文件权限表示方式,即“符号表示”和“八进制表示”。
(1)符号表示方式:
- --- --- ---
type owner group others
文件的权限是这样子分配的 读 写 可执行 分别对应的是 r w x 如果没有那一个权限,用 - 代替
(-文件 d目录 |连接符号)
例如:-rwxr-xr-x
(2)八进制表示方式:
r ——> 004
w ——> 002
x ——> 001
- ——> 000
0755
0777
0555
0444
0666
复制代码
3. 打开模式
文件打开模式:
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_SYNC int = syscall.O_SYNC
O_TRUNC int = syscall.O_TRUNC
)
复制代码
4. File操作
type File
func Create(name string) (file *File, err error)
func Open(name string) (file *File, err error)
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
func NewFile(fd uintptr, name string) *File
func Pipe() (r *File, w *File, err error)
func (f *File) Name() string
func (f *File) Stat() (fi FileInfo, err error)
func (f *File) Fd() uintptr
func (f *File) Chdir() error
func (f *File) Chmod(mode FileMode) error
func (f *File) Chown(uid, gid int) error
func (f *File) Close() error
func (f *File) Readdir(n int) (fi []FileInfo, err error)
func (f *File) Readdirnames(n int) (names []string, err error)
func (f *File) Truncate(size int64) error
复制代码
5. 示例代码
文件信息:FileInfo
package main
import (
"os"
"fmt"
)
func main() {
fileInfo,err := os.Stat("/Users/ruby/Documents/pro/a/aa.txt")
if err != nil{
fmt.Println("err :",err)
return
}
fmt.Printf("%T\n",fileInfo)
fmt.Println(fileInfo.Name())
fmt.Println(fileInfo.Size())
fmt.Println(fileInfo.IsDir())
fmt.Println(fileInfo.ModTime())
fmt.Println(fileInfo.Mode())
}
复制代码
文件操作实例:
package main
import (
"fmt"
"path/filepath"
"path"
"os"
)
func main() {
fileName1:="/Users/ruby/Documents/pro/a/aa.txt"
fileName2:="bb.txt"
fmt.Println(filepath.IsAbs(fileName1))
fmt.Println(filepath.IsAbs(fileName2))
fmt.Println(filepath.Abs(fileName1))
fmt.Println(filepath.Abs(fileName2))
fmt.Println("获取父目录:",path.Join(fileName1,".."))
err := os.RemoveAll("/Users/ruby/Documents/pro/a/cc")
if err != nil{
fmt.Println("err:",err)
return
}
fmt.Println("删除目录成功。。")
}
复制代码