1.介绍
在Go
语言中,文件操作的大多数函数都在os
包里面,文件的信息包括文件名、文件大小、修改权限、修改时间等。
1.1 文件接口属性(FileInfo)
type FileInfo interface { Name() string Size() int64 Mode() FileMode ModTime() time.Time IsDir() bool Sys() interface{} }
|
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 main import ( "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()) }
|
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 main import ( "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")) }
|
3.目录操作
3.1 创建目录
1.方法列表
方法 |
描述 |
os.Mkdir(name string, perm FileMode) error |
创建名称为name 的目录,权限设置是perm |
os.MkdirAll(path string, perm FileMode) error |
根据path 创建多级子目录 |
2.使用示例
package main import ( "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) if err == nil { return true, nil } 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 main import ( "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 main import ( "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 main import ( "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() } }
|
4.3 读取文件
读取文件步骤: 打开文件(Open
) 、读取文件(Read
)、关闭文件(Close
)
package main import ( "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() }
|
4.4 写入文件
写入文件步骤: 打开文件(OpenFile
) 、写入文件(Write
)、关闭文件(Close
)
package main import ( "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 main import ( "fmt" "io" "os" ) func main(){ 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 } defer sourceA.Close() targetB, err := os.Create(fileB) if err != nil { fmt.Printf("os.Create 创建新文件失败,err:%s \n" , err.Error()) return } defer targetB.Close() written, err := io.Copy(targetB, sourceA) if err != nil { fmt.Printf("文件复制失败,err:%s \n" , err.Error()) return } fmt.Printf("文件复制成功: %d \n" ,written) }
|
4.删除文件
同 3.3 删除目录