1.介绍

Go语言中,文件操作的大多数函数都在os包外面,文件的信息包含文件名、文件大小、批改权限、批改工夫等。

1.1 文件接口属性(FileInfo)

type FileInfo interface {    Name() string       // 文件名    Size() int64        // 文件大小    Mode() FileMode     // 批改权限    ModTime() time.Time // 最初批改工夫    IsDir() bool        // 判断是否是目录    Sys() interface{}   // 文件的详细信息,获取的值是*syscall.Stat_t类型 }

1.2 文件信息结构体(fileStat)

type fileStat struct {    name    string    size    int64    mode    FileMode    modTime time.Time    sys     syscall.Stat_t}
1.fileStat构造体的罕用办法汇总
办法名形容
Name() string返回文件名
IsDir() bool判断是否是目录
Size() int64返回文件大小
Mode() FileMode返回文件权限
ModTime() time.Time文件的最初批改工夫
Sys() interface{}文件的详细信息,获取的值是*syscall.Stat_t类型
2.应用示例
package mainimport (    "fmt"    "os")func main(){    fp := "./public/test1.txt"    fileInfo, err := os.Stat(fp)    if err != nil {        fmt.Println(err.Error())        return    }    fmt.Printf("类型: %T\n",fileInfo)    fmt.Printf("文件名: %v\n",fileInfo.Name())    fmt.Printf("文件大小: %v\n",fileInfo.Size())    fmt.Printf("是否为目录: %v\n",fileInfo.IsDir())    fmt.Printf("文件权限: %v\n",fileInfo.Mode())    fmt.Printf("文件最初批改的工夫: %v\n",fileInfo.ModTime())}/**输入类型: *os.fileStat文件名: test1.txt文件大小: 11是否为目录: false文件权限: -rw-r--r--文件最初批改的工夫: 2021-01-15 16:29:53.816034553 +0800 CSTsys: &{Dev:16777220 Mode:33188 Nlink:1 Ino:15440327 Uid:501 Gid:20 Rdev:0 Pad_cgo_0:[0 0 0 0] Atimespec:{Sec:1610699394 Nsec:591237565} Mtimespec:{Sec:1610699393 Nsec:816034553} Ctimespec:{Sec:1610699393 Nsec:816034553} Birthtimespec:{Sec:1610611801 Nsec:544367649} Size:11 Blocks:8 Blksize:4096 Flags:0 Gen:0 Lspare:0 Qspare:[0 0]}*/

2.求门路办法

2.1 办法列表

办法的所属包: path/filepath

办法名形容
IsAbs(path string) bool判断是否是绝对路径
Rel(basepath, targpath string) (string, error)返回一个绝对于basepath的门路
Abs(path string) (string, error)返回绝对路径
Join(elem ...string) string拼接门路

2.2 应用示例

package mainimport (    "fmt"    "path"    "path/filepath")func main(){    basePath := "/Users/hui/Project/Go/src/study"    fp1 := "./public/test1.txt"    fp2 := "/Users/hui/Project/Go/src/study/public/static/test2.txt"    fmt.Printf("是绝对路径?: %t\n",filepath.IsAbs(fp1))    // 相对路径    rel, err := filepath.Rel(basePath, fp2)    if err != nil {        fmt.Println(err.Error())    }    fmt.Printf("fp1绝对fp2的门路?:  %v\n",rel)    // 绝对路径    abs, err := filepath.Abs(fp1)    if err != nil {        fmt.Println(err.Error())    }    fmt.Printf("fp1的绝对路径?:  %s\n",abs)    // 拼接门路    fmt.Printf("拼接门路1: %s \n",path.Join("/home/Item","go","study"))    fmt.Printf("拼接门路2: %s \n",path.Join("/home/图片","美女","beauty.jpg"))}/** 输入是绝对路径?: falsefp1绝对fp2的门路?:  public/static/test2.txtfp1的绝对路径?: /Users/hui/Project/Go/src/study/public/test1.txt拼接门路1: /home/Item/go/study 拼接门路2: /home/图片/美女/beauty.jpg */

3.目录操作

3.1 创立目录

1.办法列表
办法形容
os.Mkdir(name string, perm FileMode) error创立名称为name的目录,权限设置是perm
os.MkdirAll(path string, perm FileMode) error依据path创立多级子目录
2.应用示例
package mainimport (    "fmt"    "os")func main(){    dirName := "./img"    // 创立目录,并调配权限    err := os.Mkdir(dirName, os.ModePerm)    if err != nil {        fmt.Println(err.Error())    }    fmt.Println( dirName+ "  创立胜利!")    // 创立多级目录    dirName2 := "./public/static/css"    err = os.MkdirAll(dirName2,os.ModePerm)    if err != nil {        fmt.Println(err.Error())    }    fmt.Println( dirName2+ "  创立胜利!")}

3.2 判断目录是否存在

// 判断文件或者目录是否存在func pathIsExist(pathName string) (bool,error) {    // 获取文件或目录信息    _, err := os.Stat(pathName)    // 如果文件或目录存在,则err== nil    if err == nil {        return true, nil    }    // 应用os.IsNotExist()判断返回的谬误类型是否为true,true:阐明文件或文件夹不存在    if os.IsNotExist(err) {        return false,nil    }    // 如果谬误类型为其它,则不确定是否在存在    return false,err}

3.3 删除目录

1.办法列表
办法形容
os.Remove(name string) error删除名称为name的目录,当目录下有文件或者其余目录会出错
os.RemoveAll(path string) error依据path删除多级子目录
2.应用示例
package mainimport (    "fmt"    "os")func main(){    // 删除目录    err := os.Remove("./file")    if err != nil {        fmt.Println("Remove-> 删除失败: " + err.Error())    } else {        fmt.Println("Remove-> 删除胜利!" )    }    // 删除多级子目录    err2 := os.RemoveAll("./file/static")    if err2 != nil {        fmt.Println("RemoveAll-> 删除失败: " + err2.Error())    } else {        fmt.Println("RemoveAll-> 删除胜利!" )    }}

4.文件操作

4.1 创立文件

os.Create()创立文件,如果文件存在,会将其笼罩。os.Create()实质上调用的是OpenFile,源码如下:

func Create(name string) (*File, error) {    return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)}
应用示例
package mainimport (    "fmt"    "os")func main(){    fileName := "./file/a.txt"    //如果文件存在,则会笼罩    create, err := os.Create(fileName)    if err != nil {        fmt.Println("创立失败: " + err.Error())        return    }    fmt.Printf("创立胜利! %v\n",create)}

4.2 关上和敞开文件

1.办法列表
办法名形容
Open(name string) (*File, error)只读模式关上文件,实质上调用的是OpenFile
OpenFile(name string, flag int, perm FileMode) (*File, error)关上文件,能够传入模式和权限
2.OpenFile入参介绍
flag值代表的模式
O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式
O_APPEND追加模式
O_CREATE文件不存在,则创立
O_EXCLO_CREATE配合应用,文件必须不存在
O_SYNC关上文件用于同步I/O
O_TRUNC如果可能,关上时清空文件
3.应用示例
package mainimport (    "fmt"    "os")func main(){    // 该文件不存在    fileName := "./public/test.txt"    file1, err := os.Open(fileName)    if err != nil {        fmt.Printf("os.Open 关上文件失败,err:%s \n" , err.Error())    } else  {        fmt.Printf("os.Open 关上文件胜利,open:%v \n" , file1)        // 敞开文件        defer file1.Close()    }    // 文件不存在,则会创立文件    file2, err1 := os.OpenFile(fileName,os.O_CREATE,os.ModePerm)    if err1 != nil {        fmt.Printf("os.OpenFile 关上文件失败,err:%s \n" , err1.Error())    } else  {        fmt.Printf("os.OpenFile 关上文件胜利,open:%v \n" , file2)        // 敞开文件        defer file2.Close()    }}/**输入os.Open 关上文件失败,err:open ./public/test.txt: no such file or directory os.OpenFile 关上文件胜利,open:&{0xc0000b0120} */

4.3 读取文件

读取文件步骤: 关上文件(Open) 、读取文件(Read)、敞开文件(Close)

package mainimport (    "fmt"    "os")func main(){    fileName := "./public/test.txt"    file1, err := os.Open(fileName)    if err != nil {        fmt.Printf("os.Open 关上文件失败,err:%s \n" , err.Error())        return    }    // 定义一个变量存储读取的内容    b := make([]byte,1024)    // 读取文件    for  {        read, _ := file1.Read(b)        if read == 0 {            break        }    }    fmt.Printf("读取内容: %s \n",b)    // 敞开文件    _ = file1.Close()}// 输入: 读取内容: Hello Word! 您好,世界!

4.4 写入文件

写入文件步骤: 关上文件(OpenFile) 、写入文件(Write)、敞开文件(Close)

package mainimport (    "fmt"    "os")func main(){    fileName := "./public/hello.txt"    // 读写|创立|追加的模式 模式关上文件    file1, err := os.OpenFile(fileName,os.O_RDWR | os.O_CREATE | os.O_APPEND ,os.ModePerm )    if err != nil {        fmt.Printf("os.OpenFile 关上文件失败,err:%s \n" , err.Error())        return    }    // 写入文件    write, err := file1.Write([]byte("Go! Go! Let's Go!! 汉字 \n"))    if err != nil {        fmt.Printf("写入失败: %s \n",err.Error())    }    fmt.Printf("写入字节数: %d \n",write)    // 敞开文件    _ = file1.Close()}

4.5 复制文件

Go语言提供了io.copy()办法,用来复制文件。

package mainimport (    "fmt"    "io"    "os")func main(){    // 把fileA文件复制给fileB    fileA := "./public/hello.txt"    fileB := "./public/new.txt"    // 关上源文件    sourceA, err := os.Open(fileA)    if err != nil {        fmt.Printf("os.Open 关上文件失败,err:%s \n" , err.Error())        return    }    // 敞开文件A    defer sourceA.Close()    // 关上新文件    targetB, err := os.Create(fileB)    if err != nil {        fmt.Printf("os.Create 创立新文件失败,err:%s \n" , err.Error())        return    }    // 敞开文件B    defer targetB.Close()    // 把fileA文件复制给fileB    written, err := io.Copy(targetB, sourceA)    if err != nil {        fmt.Printf("文件复制失败,err:%s \n" , err.Error())        return    }    fmt.Printf("文件复制胜利: %d \n" ,written)}

4.6 删除文件

同 3.3 删除目录

本文由mdnice多平台公布