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_EXCL | 和O_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多平台公布