加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959

文件读取

os.File 封装了文件相关操作

  1. type File
  2. File代表一个打开的文件对象。
  3.  
  4. func Create(name string) (file *File, err error)
  5. Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError
  6.  
  7. func Open(name string) (file *File, err error)
  8. Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError
  9.  
  10. func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
  11. OpenFile是一个更一般性的文件打开函数,大多数调用者都应用OpenCreate代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError
  12.  
  13. func NewFile(fd uintptr, name string) *File
  14. NewFile使用给出的Unix文件描述符和名称创建一个文件。
  15.  
  16. func Pipe() (r *File, w *File, err error)
  17. Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。
  18.  
  19. func (f *File) Name() string
  20. Name方法返回(提供给Open/Create等方法的)文件名称。
  21.  
  22. func (f *File) Stat() (fi FileInfo, err error)
  23. Stat返回描述文件fFileInfo类型值。如果出错,错误底层类型是*PathError
  24.  
  25. func (f *File) Fd() uintptr
  26. Fd返回与文件f对应的整数类型的Unix文件描述符。
  27.  
  28. func (f *File) Chdir() error
  29. Chdir将当前工作目录修改为ff必须是一个目录。如果出错,错误底层类型是*PathError
  30.  
  31. func (f *File) Chmod(mode FileMode) error
  32. Chmod修改文件的模式。如果出错,错误底层类型是*PathError
  33.  
  34. func (f *File) Chown(uid, gid int) error
  35. Chown修改文件的用户ID和组ID。如果出错,错误底层类型是*PathError
  36.  
  37. func (f *File) Readdir(n int) (fi []FileInfo, err error)
  38. Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo,这些FileInfo是被Lstat返回的,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。
  39. 如果n>,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF
  40. 如果n<=,Readdir函数返回目录中剩余所有文件对象的FileInfo构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的FileInfo构成的切片和该错误。
  41.  
  42. func (f *File) Readdirnames(n int) (names []string, err error)
  43. Readdir读取目录f的内容,返回一个有n个成员的[]string,切片成员为目录中文件对象的名字,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。
  44. 如果n>,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF
  45. 如果n<=,Readdir函数返回目录中剩余所有文件对象的名字构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。
  46.  
  47. func (f *File) Truncate(size int64) error
  48. Truncate改变文件的大小,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是*PathError
  49.  
  50. func (f *File) Read(b []byte) (n int, err error)
  51. Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值errio.EOF
  52.  
  53. func (f *File) ReadAt(b []byte, off int64) (n int, err error)
  54. ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF
  55.  
  56. func (f *File) Write(b []byte) (n int, err error)
  57. Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
  58.  
  59. func (f *File) WriteString(s string) (ret int, err error)
  60. WriteString类似Write,但接受一个字符串参数。
  61.  
  62. func (f *File) WriteAt(b []byte, off int64) (n int, err error)
  63. WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
  64.  
  65. func (f *File) Seek(offset int64, whence int) (ret int64, err error)
  66. Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
  67.  
  68. func (f *File) Sync() (err error)
  69. Sync递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存。
  70.  
  71. func (f *File) Close() error
  72. Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。

os.File Pkg Doc

读写参数

文件打开模式:

  1. const (
  2. O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
  3. O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
  4. O_RDWR int = syscall.O_RDWR // 读写模式打开文件
  5. O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
  6. O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
  7. O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
  8. O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
  9. O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
  10. )

权限控制:

  1. r ——>
  2. w ——>
  3. x ——>

读取栗子

  1. os.Open || os.OpenFile
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. )
  8.  
  9. func main() {
  10. // file, err := os.Open("/tmp/test")
  11. file, err := os.OpenFile("/tmp/test", os.O_CREATE|os.O_WRONLY, )
  12. if err != nil {
  13. fmt.Println("Open file error: ", err)
  14. return
  15. }
  16. defer file.Close() //关闭文件
  17.  
  18. reader := bufio.NewReader(file) //带缓冲区的读写
  19. for {
  20. str, err := reader.ReadString('\n') // 循环读取一行
  21. if err != nil {
  22. fmt.Println("read string failed, err: ", err)
  23. return
  24. }
  25. fmt.Println("read string is %s: ", str)
  26. }
  27. }

readline

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io"
  7. "os"
  8. )
  9.  
  10. func main() {
  11. file, err := os.Open("C:/test.log")
  12. if err != nil {
  13. fmt.Println(err)
  14. return
  15. }
  16. defer file.Close()
  17. reader := bufio.NewReader(file)
  18. var line []byte
  19. for {
  20. data, prefix, err := reader.ReadLine()
  21. if err == io.EOF {
  22. break
  23. }
  24.  
  25. line = append(line, data...)
  26. if !prefix {
  27. fmt.Printf("data:%s\n", string(line))
  28. line = line[:]
  29. }
  30.  
  31. }
  32. }

读取整个文件栗子

"io/ioutil" 包实现了读取整个文件功能

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "os"
  6. "io/ioutil"
  7. )
  8.  
  9. func main() {
  10. fileName := "/tmp/test"
  11.  
  12. file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, )
  13. if err != nil {
  14. fmt.Println("Open file error: ", err)
  15. return
  16. }
  17. defer file.Close()
  18.  
  19. buf, err := ioutil.ReadAll(file)
  20. //buf, err := ioutil.ReadFile(fileName)
  21. if err != nil {
  22. fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
  23. return
  24. }
  25. fmt.Printf("%s\n", string(buf))
  26. }

读取压缩文件栗子

"compress/*" 包实现压缩文件功能。

"compress/gzip" 包实现了gzip格式压缩文件的读写

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "compress/gzip"
  6. "fmt"
  7. "os"
  8. )
  9.  
  10. func main() {
  11. fileName := "/tmp/test.log.gz"
  12.  
  13. var r *bufio.Reader
  14.  
  15. fi, err := os.Open(fileName)
  16. if err != nil {
  17. fmt.Println("error", err)
  18. os.Exit()
  19. }
  20.  
  21. fz, err := gzip.NewReader(fi)
  22. if err != nil {
  23. fmt.Println("error", err)
  24. return
  25. }
  26.  
  27. r = bufio.NewReader(fz)
  28. for {
  29. line, err := r.ReadString('\n')
  30. if err != nil {
  31. fmt.Println("Done reading file")
  32. return
  33. }
  34. fmt.Println(line)
  35. }
  36. }

文件写入

file.WriteString || file.Write

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "os"
  6. )
  7.  
  8. func main() {
  9. fileName := "/tmp/test_write"
  10.  
  11. file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, )
  12. if err != nil {
  13. fmt.Println("error", err)
  14. os.Exit()
  15. }
  16. defer file.Close()
  17.  
  18. fileString := "Today very happy."
  19. file.Seek(, ) // 最后增加
  20. file.WriteString(fileString)
  21. //file.Write([]byte(fileString))
  22. }

bufio.Writer.WriteString

带缓冲的写,最后要将缓冲中的数据写入下层的io.Writer接口(Flush方法)

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. )
  8.  
  9. func main() {
  10. fileName := "/tmp/test_write"
  11.  
  12. file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, )
  13. if err != nil {
  14. fmt.Println("error", err)
  15. os.Exit()
  16. }
  17. defer file.Close()
  18.  
  19. fileWrite := bufio.NewWriter(file)
  20. fileString := "good.\n"
  21. for i := ; i < ; i++ {
  22. fileWrite.WriteString(fileString)
  23. }
  24. fileWrite.Flush()
  25. }

拷贝文件栗子

从一个文件拷贝到另一个文件

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8.  
  9. func CopyFile(dstName, srcName string) (writeen int64, err error) {
  10. src, err := os.Open(dstName)
  11. if err != nil {
  12. fmt.Println(err)
  13. return
  14. }
  15. defer src.Close()
  16.  
  17. dst, err := os.OpenFile(srcName, os.O_CREATE|os.O_WRONLY, )
  18. if err != nil {
  19. fmt.Println(err)
  20. return
  21. }
  22. defer dst.Close()
  23.  
  24. return io.Copy(dst, src)
  25. }
  26.  
  27. func main() {
  28. CopyFile("/tmp/test", "/tmp/test_copy1")
  29. fmt.Println("copy done.")
  30. }

栗子

判断文件或文件夹是否存在

  1. func PathExists(path string) (bool, error) {
  2. /*
  3. 判断文件或文件夹是否存在
  4. 如果返回的错误为nil,说明文件或文件夹存在
  5. 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
  6. 如果返回的错误为其它类型,则不确定是否在存在
  7. */
  8. _, err := os.Stat(path)
  9. if err == nil {
  10. return true, nil
  11. }
  12. if os.IsNotExist(err) {
  13. return false, nil
  14. }
  15. return false, err
  16. }

Go语言学习笔记(五)文件操作的更多相关文章

  1. python学习笔记(五)-文件操作2

    一.文件修改 现有文件file.txt,内容如下:二十四节气歌春雨惊春清谷天,夏满芒夏暑相连.秋处露秋寒霜降,冬雪雪冬小大寒.上半年逢六廿一,下半年逢八廿三.每月两节日期定,最多相差一二天.要求:将文 ...

  2. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  3. python的学习笔记01_5文件操作

    一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...

  4. node 学习笔记 - fs 文件操作

    本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...

  5. node学习笔记3——文件操作fs

    文件操作关键字: http('fs') ——  请求 node 里面的 http 模块 readFile ——  读文件,参数包括 文件名,回调函数 writeFile ——  写文件,参数包括 文件 ...

  6. python学习笔记(三):文件操作和集合

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作: f = open('file.txt','r') #以只读方式打开一个 ...

  7. python学习笔记:文件操作和集合

    一.文件操作 文件读写步骤:有一个文件,打开文件,操作文件读写文件,关闭文件. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例) 模式 可做操作 若文件不存在 是否覆盖 r ...

  8. Java 学习笔记(14)—— 文件操作

    java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...

  9. python学习笔记之文件操作(三)

    这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦 ...

  10. python学习笔记4(文件操作)

    文件操作: 1.f=open(”caidan”,”w”,encoding=”utf8”)      直接打开一个文件,如果文件不存在则创建文件 f.close() 2.with open (”caid ...

随机推荐

  1. chip-seq数据分析中peak-calling软件-------MACS的安装

    1.下载MACS软件安装包(作者的系统为Ubuntu) 网址链接:http://liulab.dfci.harvard.edu/MACS/ 2.解压文件: tar -zxvf MACS**.tar.g ...

  2. Mybatis配置(一)

    1.导入Mybatis包 2.得到SqlSession来访问数据库 /** * 访问数据库 */public class DBAccess {          public SqlSession g ...

  3. nginx四层负载均衡配置

    nginx四层负载均衡配置代理Mysql集群 环境如下: ip 192.168.6.203 Nginx ip 192.168.6.*(多台) Mysql 步骤一 查看Nginx是否安装stream模块 ...

  4. 尝试向树莓派3B引入Drbian 9 arm64-PART 1

    Stage 1:试图加入arm64软件包 笔者默认您清楚这些指令背后的意义以及其可能造成的后果,并默认您已备份重要资料 sudo dpkg --add-archietcture arm64 sudo ...

  5. swiper结合ajax的轮播图

    Swiper 是什么:是纯JavaScript打造的滑动特效插件,能够实现触屏焦点图.触屏tab切换.触屏多图切换等常用效果. 开源.免费.稳定.应用广泛. 这就是swiper简单的介绍,由于是结合a ...

  6. js关闭当前窗口,window.close()方法只能是window.open打开的才能执行关闭

    js关闭当前窗口,window.close()方法只能是window.open打开的才能执行关闭. function closeWin() { //open(location, '_self').cl ...

  7. linux下修改Apache配置文件

    linux下修改host文件host文件存放路径 /etc/hosts 可以用vim编辑 //Apache配置虚拟主机 /usr/local/apache/conf/extra/httpd-vhost ...

  8. 大话Session

    [原创]转载请保留出处:shoru.cnblogs.com 晋哥哥的私房钱 引言 在web开发中,session是个非常重要的概念.在许多动态网站的开发者看来,session就是一个变量,而且其表现像 ...

  9. 类间调用inline函数的效率

    问题描述: class A { public: int x, y, k, NY; inline int f(int i, int j, int k)  {return ((i)*(NY + 1) * ...

  10. 配置SSH无秘钥登录

    [hadoop@hadoop01 ~]$ cd .ssh [hadoop@hadoop01 .ssh]$ ls authorized_keys id_rsa id_rsa.pub known_host ...