• Go语言中的File文件操作


    目录

    一、File文件操作  

    1、FileInfo接口

    2、打开模式

    3、File操作


    一、File文件操作  

    file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。

    1、FileInfo接口

     FileInfo:文件信息
       interface

    •       Name(),base name of the file 文件名.扩展名 aa.txt
    •       Size(),文件大小,字节为单位
    •       IsDir(),是否是目录
    •       ModTime(),修改时间
    •       Mode(),权限 (读、写、可执行,分别对应的是 r、w、x )如果没有那一个权限,用 - 代替(-文件 d目录 |连接符号)。例如:-rwxr-xr-x
    •       Sys() interface{}   // 基础数据源接口(can return nil)

    相关代码演示: 

    1. package main
    2. import (
    3. "fmt"
    4. "os"
    5. )
    6. func main() {
    7. fileInfo,err := os.Stat("./abc.txt")
    8. if err != nil{
    9. fmt.Println("err :",err)
    10. return
    11. }
    12. //fileInfo1:="abcd.txt"
    13. //os.Create(fileInfo1)
    14. fmt.Printf("%T\n",fileInfo)
    15. //文件名
    16. fmt.Println(fileInfo.Name())
    17. //文件大小
    18. fmt.Println(fileInfo.Size())
    19. //是否是目录
    20. fmt.Println(fileInfo.IsDir()) //IsDirectory
    21. //修改时间
    22. fmt.Println(fileInfo.ModTime())
    23. //权限
    24. fmt.Println(fileInfo.Mode()) //-rw-r--r--
    25. }

    2、打开模式

    文件打开模式:

    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   // 打开文件用于同步I/O
        O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
    )

    3、File操作

    1.路径:
       相对路径:relative
          ab.txt
          相对于当前工程
       绝对路径:absolute
          /Users/ruby/Documents/pro/a/aa.txt

       .当前目录
       ..上一层
    2.创建文件夹,如果文件夹存在,创建失败
       os.MkDir(),创建一层
       os.MkDirAll(),可以创建多层

    3.创建文件,Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
       os.Create(),创建文件

    4.打开文件:让当前的程序,和指定的文件之间建立一个连接
       os.Open(filename)
       os.OpenFile(filename,mode,perm)

    5.关闭文件:程序和文件之间的链接断开。
       file.Close()

    5.删除文件或目录:慎用,慎用,再慎用
       os.Remove(),删除文件和空目录
       os.RemoveAll(),删除所有

    1. type File
    2. //File代表一个打开的文件对象。
    3. func Create(name string) (file *File, err error)
    4. //Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。
    5. func Open(name string) (file *File, err error)
    6. //Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。
    7. func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
    8. //OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
    9. func NewFile(fd uintptr, name string) *File
    10. //NewFile使用给出的Unix文件描述符和名称创建一个文件。
    11. func Pipe() (r *File, w *File, err error)
    12. //Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。
    13. func (f *File) Name() string
    14. //Name方法返回(提供给Open/Create等方法的)文件名称。
    15. func (f *File) Stat() (fi FileInfo, err error)
    16. //Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。
    17. func (f *File) Fd() uintptr
    18. //Fd返回与文件f对应的整数类型的Unix文件描述符。
    19. func (f *File) Chdir() error
    20. //Chdir将当前工作目录修改为f,f必须是一个目录。如果出错,错误底层类型是*PathError。
    21. func (f *File) Chmod(mode FileMode) error
    22. //Chmod修改文件的模式。如果出错,错误底层类型是*PathError。
    23. func (f *File) Chown(uid, gid int) error
    24. //Chown修改文件的用户ID和组ID。如果出错,错误底层类型是*PathError。
    25. func (f *File) Close() error
    26. //Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
    27. func (f *File) Readdir(n int) (fi []FileInfo, err error)
    28. //Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo,这些FileInfo是被Lstat返回的,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。如果n<=0,Readdir函数返回目录中剩余所有文件对象的FileInfo构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的FileInfo构成的切片和该错误。
    29. func (f *File) Readdirnames(n int) (names []string, err error)
    30. //Readdir读取目录f的内容,返回一个有n个成员的[]string,切片成员为目录中文件对象的名字,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。如果n<=0,Readdir函数返回目录中剩余所有文件对象的名字构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。
    31. func (f *File) Truncate(size int64) error
    32. //Truncate改变文件的大小,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是*PathError。

    示例代码:

    1. package main
    2. import (
    3. "fmt"
    4. "os"
    5. "path"
    6. "path/filepath"
    7. )
    8. func main() {
    9. //1.路径
    10. fileName1:="E:\\笔记本的\\Golang-100-Days-master\\ab.txt"
    11. fileName2:="bb.txt"
    12. fmt.Println(filepath.IsAbs(fileName1)) //true
    13. fmt.Println(filepath.IsAbs(fileName2)) //false
    14. fmt.Println(filepath.Abs(fileName1))
    15. fmt.Println(filepath.Abs(fileName2)) // E:\笔记本的\Golang-100-Days-master\bb.txt
    16. fmt.Println("获取父目录:",path.Join(fileName1,".."))
    17. //2.创建目录
    18. err := os.Mkdir("/Users/ruby/Documents/pro/a/bb",os.ModePerm)
    19. if err != nil{
    20. fmt.Println("err:",err)
    21. return
    22. }
    23. fmt.Println("文件夹创建成功。。")
    24. err3 :=os.MkdirAll("/Users/ruby/Documents/pro/a/cc/dd/ee",os.ModePerm)
    25. if err3 != nil{
    26. fmt.Println("err:",err3)
    27. return
    28. }
    29. fmt.Println("多层文件夹创建成功")
    30. //3.创建文件:Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
    31. file1,err :=os.Create("/Users/ruby/Documents/pro/a/ab.txt")
    32. if err != nil{
    33. fmt.Println("err:",err)
    34. return
    35. }
    36. fmt.Println(file1)
    37. file2,err := os.Create(fileName2)//创建相对路径的文件,是以当前工程为参照的
    38. if err != nil{
    39. fmt.Println("err :",err)
    40. return
    41. }
    42. fmt.Println(file2)
    43. //4.打开文件:
    44. file3 ,err := os.Open(fileName1) //只读的
    45. if err != nil{
    46. fmt.Println("err:",err)
    47. return
    48. }
    49. fmt.Println(file3)
    50. /*
    51. 第一个参数:文件名称
    52. 第二个参数:文件的打开方式
    53. const (
    54. // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
    55. O_RDONLY int = syscall.O_RDONLY // open the file read-only.
    56. O_WRONLY int = syscall.O_WRONLY // open the file write-only.
    57. O_RDWR int = syscall.O_RDWR // open the file read-write.
    58. // The remaining values may be or'ed in to control behavior.
    59. O_APPEND int = syscall.O_APPEND // append data to the file when writing.
    60. O_CREATE int = syscall.O_CREAT // create a new file if none exists.
    61. O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist.
    62. O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
    63. O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened.
    64. )
    65. 第三个参数:文件的权限:文件不存在创建文件,需要指定权限
    66. */
    67. file4,err := os.OpenFile(fileName1,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
    68. if err != nil{
    69. fmt.Println("err:",err)
    70. return
    71. }
    72. fmt.Println(file4)
    73. //5关闭文件,
    74. file4.Close()
    75. //6.删除文件或文件夹:
    76. //删除文件
    77. err1 := os.Remove("/Users/ruby/Documents/pro/a/aa.txt")
    78. if err1 != nil{
    79. fmt.Println("err:",err1)
    80. return
    81. }
    82. fmt.Println("删除文件成功。。")
    83. //删除目录
    84. err2 := os.RemoveAll("/Users/ruby/Documents/pro/a/cc")
    85. if err2 != nil{
    86. fmt.Println("err:",err2)
    87. return
    88. }
    89. fmt.Println("删除目录成功。。")
    90. }
  • 相关阅读:
    Google Earth Engine(GEE)——用geometry点来改变选的影像范围,并进行加载的APP
    Js判断数据类型的4种⽅式
    oracle10g的dataguard测试
    java刷题day 02
    HUAWEI华为MateBook X Pro 2021款 i7 集显(MACHD-WFE9Q)原装出厂Win10系统20H2
    存储数据迁移需求和迁移工具分析
    大模型相关资料整理
    Worthington丨Worthington 磷酸酶,碱性
    技术周总结2024.06.03~06.09(K8S & HikariCP数据库连接池)
    如何保障UDP传输中数据文件不丢失?
  • 原文地址:https://blog.csdn.net/m0_51530927/article/details/125886015