首先获取文件名,借助os包中都得stat()函数来获取文件属性信息,在函数返回的文件属性中包含文件名和文件大小,Stat参数中name传入的是文件访问的绝对路径,FileInfo中的Name()函数可以将文件名单独提取出来
os.Stat
func (f *File) Stat() (fi FileInfo, err error)
Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。
type FileInfo
type FileInfo interface {
Name() string // 文件的名字(不含扩展名)
Size() int64 // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
Mode() FileMode // 文件的模式位
ModTime() time.Time // 文件的修改时间
IsDir() bool // 等价于Mode().IsDir()
Sys() interface{} // 底层数据来源(可以返回nil)
}
fileInfo用来描述一个文件对象。
func main(){
fileinfo, err := os.Stat("/home/wxy/桌面/debug.txt")
if err != nil{
fmt.Println(err)
return
}
fmt.Printf("%T \n", fileinfo) //*os.fileStat
fileName := fileinfo.Name()
fmt.Println(fileName) // debug.txt
fileSize := fileinfo.Size()
fmt.Println(fileSize)
isDir := fileinfo.IsDir()
fmt.Println(isDir) // false
fileModTime := fileinfo.ModTime()
fmt.Println(fileModTime) //
fileMode := fileinfo.Mode()
fmt.Println(fileMode) // -rw-r--r--
}
filepath.IsAbs
判断文件是否绝对路径
file := "/home/wxy/桌面/debug.txt"
file2 := "a.txt"
fmt.Println(filepath.IsAbs(file)) //Ture
fmt.Println(filepath.IsAbs(file2)) //False
filepath.Abs
获取文件绝对路径
file := "/home/wxy/桌面/debug.txt"
file2 := "a.txt"
fileabs, err := filepath.Abs(file)
if err != nil{
fmt.Println(err)
}
fmt.Println(fileabs)
fileabs, err = filepath.Abs(file2)
if err != nil{
fmt.Println(err)
}
fmt.Println(fileabs) // /home/wxy/go/src/test/a.txt
path.Join
获取文件的上层或上上层路径
file := "/home/wxy/桌面/debug.txt"
fileparent := path.Join(file, "../..")
fmt.Println(fileparent) // /home/wxy
path.Dir
获取文件的父级路径
file := "/home/wxy/桌面/debug.txt"
fileparent = path.Dir(file)
fmt.Println(fileparent) // /home/wxy/桌面
获取执行文件路径
func main(){
basefile, err := exec.LookPath(os.Args[0])
if err != nil{
fmt.Println(err)
}
basepath, err:= filepath.Abs(basefile)
if err != nil{
fmt.Println(err)
}
fmt.Println(basepath)
parentpath := path.Dir(basepath)
fmt.Println(parentpath)
}
os.Mkdir
创建目录
err = os.Mkdir("/home/wxy/go/src/test/dir",os.ModePerm) // os.ModePerm 文件夹777权限
if err != nil{
fmt.Println(err)
}
注意:若文件目录存在则报错
os.MkdirAll
创建多层目录,类似 mkdir -p
err = os.MkdirAll("/home/wxy/go/src/test/dir/a/b/c", os.ModePerm)
if err != nil{
fmt.Println(err)
}
注意:目录存在不会报错
文件编辑
文件打开模式
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_CREATE 配合使用, 文件必须不存在.
O_SYNC int = syscall.O_SYNC // 打开文件用于同步IO.
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件.
)
os.create 创建文件
func create (name string) (file *File, err error)
create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
如果成功,返回的文件对象可用于I/0;对应的文件描述符具有0_RDWR模式。如果出错,错误底层类型是*PathError
func main(){
fileName := "b.txt"
file, err := os.Create(fileName)
if err != nil{
fmt.Println(err)
}
fmt.Printf("%T \n",file) //*os.File
}
os.Open 只读模式打开文件
func Open (name string) (file *File, err error)
打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有0_RDONLY模式。如果出错,错误底层类型是*PathError。
func main(){
fileName := "b.txt"
file, err := os.Open(fileName)
if err != nil{
fmt.Println(err)
}
fmt.Println(file.Name())
file.Close() // 关闭文件,打开的文件操作完要关闭
}
os.OpenFile 可配置文件打开模式
func OpenFile (name string, flag int, perm FileMode) (file *File, err error)
相对于os.Open多了文件打卡模式参数和打开权限参数,它会使用指定的选项(如0_RDONLY等)、指定的模式(如9666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/0。如果出错,错误
底层类型是*PathError。
func main(){
fileName := "b.txt"
file, err := os.OpenFile(fileName,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
if err != nil{
fmt.Println(err)
}
fmt.Println(file.Name())
file.Close()
}
参数 os.O_RDONLY|os.O_WRONLY 表示以读模式和写模式打开
os.ModePerm 表示打开权限 0777
file.Read 读取文件内容
func (f *File) Read(b []byte) (n int, err error)
func main(){
fileName := "a.txt"
//打开文件
file, err := os.Open(fileName)
if err != nil{
fmt.Println(err)
}
//创建[]byte用来缓存文件内容
buf := make([]byte,4069)
//将文件内容读到[]byte中
n, err := file.Read(buf)
if err != nil{
fmt.Println(err)
}
content := string(buf[:n])
file.Close()
fmt.Println(content)
}
file.Write 向文件内写入文本
func (f *File) Write(b []byte) (n int, err error)
参数是[]byte类型的字节,需要将文本转为[]byte类型,返回的n是写入的字节数量
func main(){
fileName := "a.txt"
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
if err != nil{
fmt.Println(err)
}
content := []byte("hello goland 123 ....")
file.Write(content)
file.Close()
}
os.O_WRONLY|os.O_APPEND 表示以写模式打开文件,并且写入的内容是向末尾追加
os.Remove 删除文件或文件夹
func Remove(name string) error
删除文件时,可直接删除,若删除的是目录,需要这个目录是空目录,否则报错无法删除,可以选择使用os.RemoveAll强制删除
os.Remove和os.RemoveAll删除的内容无法找回,类似rm -rf
func main(){
fileName := "bb.txt"
err := os.Remove(fileName)
if err != nil{
fmt.Println(err)
}
}
os.Rename 文件或文件夹重名
func Rename(oldpath, newpath string) error
重命名不影响文件或文件夹的内容
func main(){
dirName := "/home/wxy/go/src/test/dir/a/b/c"
newdirName := "/home/wxy/go/src/test/dir/a/b/cc"
err := os.Rename(dirName, newdirName)
if err != nil{
fmt.Println(err)
}
}
io.Copy 文件拷贝
package main
import (
"fmt"
"io"
"os"
)
func main() {
CopyFile()
}
func CopyFile(){
file1, err := os.Open("test.jpg")
if err != nil{
fmt.Println(err)
}
file2, err := os.OpenFile("cptest.jpg", os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
if err != nil{
fmt.Println(err)
}
n, err := io.Copy(file2, file1)
if err != nil{
fmt.Println(err)
}
fmt.Println(n)
}