likes
comments
collection
share

【Golang】Go基础之File文件操作 | 七

作者站长头像
站长
· 阅读数 16

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

首先,file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。

1. FileInfo接口

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("删除目录成功。。")
}