十三、文件操作

os 包提供了对文件、系统和进程的操作函数
a) 文件操作
常用常量:
⚫ Stdin
⚫ Stdout
⚫ Stderr
⚫ ModePerm:0777
常用函数:
⚫ Chmod:修改文件权限
⚫ Chown:修改文件所属用户,用户组
⚫ Chtimes:修改文件访问时间和修改时间
⚫ IsExist:与 os.Stat 一起用于判断文件存在
⚫ IsNotExist:与 os.Stat 一起用于判断文件不存在
⚫ Link:创建软链接
⚫ Mkdir创建文件夹手撕 Go 语言
⚫ MkdirAll:创建文件夹(父目录不存在逐层创建)
⚫ Remove:移除文件或空文件夹
⚫ RemoveAll:移除所有文件
⚫ Rename:重命名
常用结构体:
⚫ File:对文件操作
常用函数:
➢ Create:创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)
➢ Open:打开文件并返回文件对象指针
➢ OpenFile:按指定权限打开文件,并返回文件指针对象
常用方法:
➢ Read:读取文件到字节切片
➢ Write:写入字节切片到文件
➢ WriteString:写入字符串到文件
➢ Readdir:获取目录下所有文件信息
➢ Readdirnames:获取目录下所有文件名
➢ Seek:设置文件指针位置
➢ Stat:获取文件状态信息
➢ Sync:同步文件到硬盘
➢ Close:关闭文件
⚫ FileInfo:文件状态信息
常用函数:
➢ Lstat:获取文件路径文件信息(对于链接返回连接文件信息)
➢ Stat:获取文件路径文件信息(对于链接返回连接到的文件的信息)
常用方法:
➢ Name:获取文件名
➢ Size:获取文件大小
➢ Mode:获取文件模式
➢ ModTime:获取修改时间
➢ IsDir:判断是否为文件夹
⚫ FileMode:文件模式
常用方法:
➢ IsDir:判断是否为文件夹
b) 系统操作
常用函数:
⚫ Environ:获取环境变量切片
⚫ Setenv:设置环境变量手撕 Go 语言
⚫ Getenv:获取环境变量
⚫ LookupEnv: 获取环境变量
⚫ Unsetenv:清除环境变量
⚫ Clearenv:清空环境变量
⚫ Executable:获取当前执行文件路径
⚫ Hostname:获取主机名
⚫ TempDir:获取临时目录
⚫ UserHomeDir:获取用户 home 目录
⚫ UserCacheDir:获取用户缓存目录
c) 进程操作
常用常量:
⚫ Args:获取命令行参数
常用函数:
⚫ Getuid:获取进程所属用户 ID
⚫ Getgid:获取进程所属用户组 ID
⚫ Getpid:获取当前进程 id
⚫ Getppid:获取父进程 id
⚫ Getwd:获取工作目录
⚫ Chdir:修改当前工作目录
⚫ Exit:退出程序
常用结构体:
⚫ Process
常用方法
➢ FindProcess:根据进程 id 查找进程对象指针
➢ StartProcess:启动进程
➢ Kill:杀死进程
➢ Release:释放进程资源信息
➢ Signal:发送信息给进程
➢ Wait:等待进程退出,并返回进程状态信息指针
⚫ ProcessState
常用方法:
➢ ExitCode:退出状态码
➢ Exited:是否已经退出
➢ Pid:进程 id
➢ Success:是否成功退出
➢ SystemTime:内核态执行时间
➢ UserTime:用户态时间时间

1.读取&创建

package main

import (
   "fmt"
   "io"
   "os"
)

func main() {
   path := "user.txt"
   path2 := "user2.txt"
   //创建文件
   file2,_ := os.Create(path2)
   file , err := os.Open(path)
   if err != nil {
      fmt.Println(err)
   }else {
      bytes := make([]byte, 20)
      for {
         //这里n是传回来的长度  比如切片是20字节 但是文件只有10字节  n就是读取回来文件内容长度
         n, err := file.Read(bytes)
         if err != nil {
            //io.EOF 是当文件读取到末尾会有一个返回值err 为io.EOF 表示文件读取完毕
            if err != io.EOF {
               fmt.Println(err)
            }
            break
         } else if err == nil {
            //把user.txt 读并且写入user2.txt
            file2.Write(bytes[:n])
            fmt.Print(string(bytes[:n]))
         }
      }
   }
   file.Close()
}

2.写入

package main

import (
   "fmt"
   "os"
)
//每次创建文件写入 都是删除重新写入
func main() {
   path := "user2.txt"
   file,err := os.Create(path)
   if err != nil {
      fmt.Println(err)
   }else if err == nil {
      file.Write([]byte("bbbbb"))
      file.WriteString("ccccccc")
   }
   file.Close()
}

3.删除&重命名

(1)删除


package main

import "os"

func main() {
   //创建目录
   //这里有个返回值 如果文件夹存在 会返回一个报错
   os.Mkdir("test01",0644)
   //重命名
   os.Rename("test01","test02")
   //删除
   os.Remove("test02")

   //如果目录有子目录 创建
   os.MkdirAll("test/a",0644)
   //如果目录有子目录remove 会无法删除 需要用removeall
   os.RemoveAll("test")

}

(2)重命名

package main

import "os"

func main() {
   //重命名
   os.Rename("bbb.txt","user.txt")
   //删除
   os.Remove("user.txt")
}

4.文件指针

package main

import (
   "fmt"
   "os"
)

func main() {
   file,_ := os.Open("user3.txt")
   //偏移量,相对位置
   //文件开始  0  os.SEEK_SET
   //当前位置  1  os.SEET_CUR
   //文件末尾  2  os.SEET_END
   //偏移量正数向后偏移多少字节,负数向前偏移多少字节
   //一般用于打开文件的时候直接跳至末尾开始追加
   fmt.Println(file.Seek(-1,2))
   bytes := make([]byte,100)
   n ,err := file.Read(bytes)
   fmt.Println(n,err,string(bytes[:n]))
   n,err = file.Read(bytes)
   fmt.Println(n,err,bytes[:n])
   file.Close()
}

5.追加

package main

import (
   "os"
   "strconv"
   "time"
)

func main() {
   path := "user3.txt"
   //os.ModePerm  子网掩码 默认0777
   //os.O_APPEND 追加
   //os.O_CREATE 创建
   //这里的意思使如果没有就创建 如果有就追加 OpenFile这里有很多常量 常用的就这两个
   file,err  := os.OpenFile(path,os.O_APPEND|os.O_CREATE,os.ModePerm)

   if err == nil {
      //这里formatint 也可以用fmt.Sprintf
      file.WriteString(strconv.FormatInt(time.Now().Unix(),10))
      file.WriteString("\n")
      file.Close()
   }
}

6.获取文件信息

package main

import (
   "fmt"
   "os"
)

func main() {
   //判断文件是否存在
   file ,err := os.Open("xxx")
   if err != nil {
      if os.IsNotExist(err){
         fmt.Println("文件不存在")
      }
   }else {
      file.Close()
   }

   for _,path := range []string{"xxxx","logs.go","dir.go"} {
      fileinfo,err := os.Stat(path)
      if err != nil {
         if os.IsNotExist(err){
            fmt.Println("文件不存在")
         }
      }else {
         //获取文件名
         fmt.Println(fileinfo.Name())
         //判断是否是目录 是目录返回true 不是则返回false
         fmt.Println(fileinfo.IsDir())
         //获取权限rwx
         fmt.Println(fileinfo.Mode())
         //获取最后修改时间
         fmt.Println(fileinfo.ModTime())
         //获取文件大小  单位字节
         fmt.Println(fileinfo.Size())
         fmt.Println(fileinfo.Sys())

      }

   }
}
发布了112 篇原创文章 · 获赞 12 · 访问量 6660

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/104962937