传送门:文件操作

主函数

  1. //读文件
  2. func main() {
  3. fmt.Println("======文件打开--func Open========")
  4. filedemo.FileOpen()
  5. fmt.Println("======文件读取--func (*File) Read========")
  6. filedemo.FileRead()
  7. fmt.Println("======循环读取--for========")
  8. filedemo.CycleRead()
  9. fmt.Println("======循环读取--bufio.NewReader(file)========")
  10. filedemo.BufioRead() //带缓冲
  11. fmt.Println("======读取--ioutil.ReadFile(filePath)========")
  12. filedemo.IoutilRead() //不需要Open和Close
  13. }
  14. //写文件
  15. func main() {
  16. fmt.Println("====写文件操作os.OpenFile()&bufio.NewWriter====")
  17. filedemo.BufioWrite()
  18. fmt.Println("====覆盖原文件os.O_TRUNC====")
  19. filedemo.HaveWrite()
  20. fmt.Println("====追加os.O_APPEND====")
  21. filedemo.AddWrite()
  22. fmt.Println("====读写 os.O_RDWR ====")
  23. filedemo.RdwrWrite()
  24. fmt.Println("====a文件导入到b文件ioutil.ReadFile()&ioutil.WriteFile()====")
  25. filedemo.ToLeadWrite()
  26. fmt.Println("====判断文件是否存在os.Stat(path) ====")
  27. filedemo.BoolExists("e:/newproject/test_log/demo16/xx.txt")
  28. fmt.Println("====拷贝 图片/视频 ====")
  29. srcFile := "e:/newproject/Adream.jpg"
  30. dstFile := "e:/newproject/AdreamCopy.jpg"
  31. _, err := filedemo.CopyFile2(dstFile,srcFile)
  32. if err == nil {
  33. fmt.Println("拷贝完成")
  34. } else {
  35. fmt.Printf("拷贝错误 err = %v\n", err)
  36. }
  37. }

判断文件是否存在os.Stat(path)

  1. package filedemo
  2. import (
  3. "os"
  4. )
  5. /*func Stat
  6. func Stat(name string) (fi FileInfo, err error)
  7. Stat返回一个描述name指定的文件对象的FileInfo。
  8. 如果指定的文件对象是一个符号链接,返回的FileInfo描述该符号链接指向的文件的信息,
  9. 本函数会尝试跳转该链接。如果出错,返回的错误值为*PathError类型。
  10. */
  11. //判断文件是否存在 true 存在 false不存在
  12. func BoolExists(path string) (bool,error) {
  13. _ , err := os.Stat(path)
  14. //如果返回的错误为nil,说明文件或文件夹存在
  15. if err == nil{
  16. return true,nil
  17. }
  18. //如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
  19. if os.IsNotExist(err){
  20. return false,nil
  21. }
  22. //如果返回的错误为其他类型,则不确定是否存在
  23. return false,err
  24. }

打开文件os.Open(filePath)

  1. package filedemo
  2. /*
  3. func Open
  4. func Open(name string) (file *File, err error)
  5. Open打开一个文件用于读取。
  6. 如果操作成功,返回的文件对象的方法可用于读取数据;
  7. 对应的文件描述符具有O_RDONLY模式。
  8. 如果出错,错误底层类型是*PathError。
  9. */
  10. import (
  11. "fmt"
  12. "os"
  13. )
  14. //打开&关闭
  15. func FileOpen() {
  16. file, err := os.Open(filePath)
  17. if err != nil {
  18. fmt.Println("open file failed!, err:", err)
  19. return
  20. }
  21. fmt.Printf("%v\n", file)
  22. defer file.Close() //及时关闭,否则会发生内存泄露
  23. }

读文件

文件读取file.Read(tmp)

  1. package filedemo
  2. /*
  3. func (*File) Read
  4. func (f *File) Read(b []byte) (n int, err error)
  5. Read方法从f中读取最多len(b)字节数据并写入b。
  6. 它返回读取的字节数和可能遇到的任何错误。
  7. 文件终止标志是读取0个字节且返回值err为io.EOF。
  8. */
  9. import (
  10. "fmt"
  11. "io"
  12. "os"
  13. )
  14. //读取文件--基本读取
  15. func FileRead() {
  16. file, err := os.Open(filePath)
  17. if err != nil {
  18. fmt.Println("open file failed!, err:", err)
  19. return
  20. }
  21. defer file.Close()
  22. // 使用Read方法读取数据
  23. var tmp = make([]byte, 128)
  24. n, err := file.Read(tmp)
  25. if err == io.EOF {
  26. fmt.Println("文件读完了")
  27. return
  28. }
  29. if err != nil {
  30. fmt.Println("read file failed, err:", err)
  31. return
  32. }
  33. fmt.Printf("读取了%d字节数据\n", n)
  34. fmt.Println(string(tmp[:n]))
  35. }

循环读取CycleRead-for语句

  1. package filedemo
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. //读取文件--循环读取
  8. func CycleRead() {
  9. file, err := os.Open(filePath)
  10. if err != nil {
  11. fmt.Println("open file failed!, err:", err)
  12. return
  13. }
  14. defer file.Close()
  15. // 循环读取文件内容
  16. var content []byte
  17. var tmp = make([]byte, 128)
  18. for {
  19. n, err := file.Read(tmp)
  20. if err == io.EOF {
  21. fmt.Println("文件读完了")
  22. break
  23. }
  24. if err != nil {
  25. fmt.Println("read file failed, err:", err)
  26. return
  27. }
  28. content = append(content, tmp[:n]...)
  29. }
  30. fmt.Println(string(content))
  31. }

循环读取bufio.NewReader(file)

  1. package filedemo
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. //bufio是在file的基础上封装了一层API,支持更多的功能
  9. func BufioRead() {
  10. file, err := os.Open(filePath)
  11. if err != nil {
  12. fmt.Println("open file failed, err:", err)
  13. return
  14. }
  15. defer file.Close()
  16. reader := bufio.NewReader(file)
  17. //循环读取文件内容
  18. for {
  19. //读到一个换行就结束
  20. line, err := reader.ReadString('\n') //注意是字符
  21. // 代表文件末尾 err!= nil
  22. if err == io.EOF {
  23. if len(line) != 0 {
  24. fmt.Println(line)
  25. }
  26. fmt.Println("文件读完了")
  27. break
  28. }
  29. if err != nil {
  30. fmt.Println("read file failed, err:", err)
  31. return
  32. }
  33. fmt.Print(line)
  34. }
  35. }

读取ioutil.ReadFile(filePath)

不需要Open和close

  1. package filedemo
  2. /*
  3. func ReadFile
  4. func ReadFile(filename string) ([]byte, error)
  5. ReadFile 从filename指定的文件中读取数据并返回文件的内容。
  6. 成功的调用返回的err为nil而非EOF。
  7. 因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。
  8. */
  9. import (
  10. "fmt"
  11. "io/ioutil"
  12. )
  13. var filePath string = "e:/newproject/test_log/demo16/xx.txt"
  14. //io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入,只适合小文件
  15. func IoutilRead() {
  16. content, err := ioutil.ReadFile(filePath)
  17. if err != nil {
  18. fmt.Println("read file failed, err:", err)
  19. return
  20. }
  21. // fmt.Printf("%v", content) //[]byte 读出来都是数字
  22. fmt.Println(string(content)) //转换成string
  23. //没有显式的open文件,也不需要Close文件,都被封装到ReadFile内部了
  24. }

写文件

创建并写入新文件

os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666) + bufio.NewWriter(file)
创建一个新文件,写入5句你好,张三

  1. package filedemo
  2. //创建一个新文件,写入5句你好,张三
  3. //func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
  4. //写入时,使用带缓存的writer
  5. //func NewWriter(w io.Writer) *Writer
  6. //NewWriter创建一个具有默认大小缓冲、写入w的*Writer。
  7. import (
  8. "bufio"
  9. "fmt"
  10. "os"
  11. )
  12. //文件写入操作 --writeSetting带缓存
  13. //os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
  14. func BufioWrite() {
  15. filePath := "e:/newproject/test_log/demo16/b.txt"
  16. file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)
  17. if err != nil {
  18. fmt.Println("open file failed, err:", err)
  19. return
  20. }
  21. //及时关闭,防止泄露
  22. defer file.Close()
  23. //写入5句这个
  24. str := "hello,张三\n"
  25. //写入时,使用带缓存的writer
  26. writer := bufio.NewWriter(file)
  27. for i := 0; i < 5; i++ {
  28. writer.WriteString(str)
  29. }
  30. //因为writer带缓存,因此在调用WriteString是先写入缓存的,
  31. //因此需要调用Flush方法,将缓存数据写道文件中,否则文件没有数据
  32. writer.Flush()
  33. }

覆盖原文件

os.OpenFile(filePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) + bufio.NewWriter(file)

  1. package filedemo
  2. //打开一个存在的文件,将原来的内容覆盖成新的10句再见张三
  3. /*
  4. const (
  5. O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
  6. O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
  7. O_RDWR int = syscall.O_RDWR // 读写模式打开文件
  8. O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
  9. O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
  10. O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
  11. O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
  12. O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
  13. )
  14. */
  15. import (
  16. "bufio"
  17. "fmt"
  18. "os"
  19. )
  20. /*
  21. func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
  22. */
  23. //文件写入操作
  24. //os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
  25. //writeSetting带缓存
  26. func HaveWrite() {
  27. var filePath string = "e:/newproject/test_log/demo16/a.txt"
  28. file, err := os.OpenFile(filePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
  29. if err != nil {
  30. fmt.Println("open file failed, err:", err)
  31. return
  32. }
  33. //及时关闭,防止泄露
  34. defer file.Close()
  35. //写入5句这个
  36. str := "再见,张三\n"
  37. //写入时,使用带缓存的writer
  38. /*func NewWriter
  39. func NewWriter(w io.Writer) *Writer
  40. NewWriter创建一个具有默认大小缓冲、写入w的*Writer。
  41. */
  42. writer := bufio.NewWriter(file)
  43. for i := 0; i < 10; i++ {
  44. writer.WriteString(str)
  45. }
  46. //因为writer带缓存,因此在调用WriteString是先写入缓存的,
  47. //因此需要调用Flush方法,将缓存数据写道文件中,否则文件没有数据
  48. writer.Flush()
  49. }

追加

os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + bufio.NewWriter(file)

  1. package filedemo
  2. /*func NewWriter
  3. func NewWriter(w io.Writer) *Writer
  4. NewWriter创建一个具有默认大小缓冲、写入w的*Writer。
  5. */
  6. import (
  7. "bufio"
  8. "fmt"
  9. "os"
  10. )
  11. //os.O_APPEND 追加
  12. func AddWrite() {
  13. filePath := "e:/newproject/test_log/demo16/a.txt"
  14. file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
  15. if err != nil {
  16. fmt.Println("open file failed, err:", err)
  17. return
  18. }
  19. //及时关闭,防止泄露
  20. defer file.Close()
  21. //写入5句这个
  22. str := "法外狂徒\n"
  23. //写入时,使用带缓存的writer
  24. writer := bufio.NewWriter(file)
  25. for i := 0; i < 5; i++ {
  26. writer.WriteString(str)
  27. }
  28. //因为writer带缓存,因此在调用WriteString是先写入缓存的,
  29. //因此需要调用Flush方法,将缓存数据写道文件中,否则文件没有数据
  30. writer.Flush()
  31. }

读写

os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
bufio.NewReader(file)
bufio.NewWriter(file)

  1. package filedemo
  2. /*func NewWriter
  3. func NewWriter(w io.Writer) *Writer
  4. NewWriter创建一个具有默认大小缓冲、写入w的*Writer。
  5. */
  6. import (
  7. "bufio"
  8. "fmt"
  9. "io"
  10. "os"
  11. )
  12. func RdwrWrite() {
  13. filePath := "e:/newproject/test_log/demo16/a.txt"
  14. file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
  15. if err != nil {
  16. fmt.Println("open file failed, err:", err)
  17. return
  18. }
  19. //及时关闭,防止泄露
  20. defer file.Close()
  21. //先读取原来的内容,并显示在终端
  22. reader := bufio.NewReader(file)
  23. for {
  24. str,err := reader.ReadString('\n')
  25. if err == io.EOF{
  26. break
  27. }
  28. //显示到终端
  29. fmt.Println(str)
  30. }
  31. //写入5句这个
  32. str := "哪里跑\n"
  33. //写入时,使用带缓存的writer
  34. writer := bufio.NewWriter(file)
  35. for i := 0; i < 5; i++ {
  36. writer.WriteString(str)
  37. }
  38. //因为writer带缓存,因此在调用WriteString是先写入缓存的,
  39. //因此需要调用Flush方法,将缓存数据写道文件中,否则文件没有数据
  40. writer.Flush()
  41. }

a文件导入到b文件

ioutil.ReadFile(filepath1)
ioutil.WriteFile(filepath2,data,0666)

  1. package filedemo
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. )
  6. func ToLeadWrite() {
  7. //将aa.txt导入到bb.txt
  8. //1. 将aa.txt内容读取到内存
  9. //2. 将读取到的内容写入 bb.txt
  10. filepath1 := "E:/newproject/test_log/demo16/a.txt"
  11. filepath2 := "E:/newproject/test_log/demo16/bb.txt"
  12. data , err := ioutil.ReadFile(filepath1)
  13. if(err != nil){
  14. //说明文件读取有错误
  15. fmt.Printf("read file err = %v",err)
  16. return
  17. }
  18. err = ioutil.WriteFile(filepath2,data,0666)
  19. if err != nil{
  20. fmt.Printf("write file err = %v", err)
  21. }
  22. }

拷贝图片/视频

os.Open(srcFileName)
os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0644)

  1. package filedemo
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. /*func Copy
  8. func Copy(dst Writer, src Reader) (written int64, err error)
  9. 将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
  10. 对成功的调用,返回值err为nil而非EOF,
  11. 因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
  12. 如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;
  13. 否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。
  14. */
  15. //将一个文件 图片/电影 拷贝到另一个文件下
  16. //自己写一个函数,接受两个文件路径 srcFileName dstFileName
  17. func CopyFile2(dstFileName, srcFileName string) (written int64, err error) {
  18. // 以读方式打开源文件
  19. src, err := os.Open(srcFileName)
  20. if err != nil {
  21. fmt.Printf("open %s failed, err:%v.\n", srcFileName, err)
  22. return
  23. }
  24. defer src.Close()
  25. // 以写|创建的方式打开目标文件
  26. dst, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0644)
  27. if err != nil {
  28. fmt.Printf("open %s failed, err:%v.\n", dstFileName, err)
  29. return
  30. }
  31. defer dst.Close()
  32. return io.Copy(dst, src) //调用io.Copy()拷贝内容
  33. }