Go之文件操作

一:os.File封装了所有与文件操作有关的操作,File是结构体

①:常用操作

  ①:Read()举例,Read()取出len(b)的字节数据,并写入b中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package main

import (

    "fmt"

    "os"

)

func main() {

    path := "d:/abc.txt"

    file, err := os.Open(path)

    if err != nil {

        fmt.Printf("err=%v",err)

        return

    }

    defer file.Close()

    b := make([]byte, 5)

    count, err := file.Read(b)

    if err != nil {

        fmt.Printf("err=",err)

        return

    }

    fmt.Println(count)

    fmt.Printf("%c",b)

}

结果

[ `go run os.go` | done ]

    5

    [h e l l o]

   其他方式使用大同小异。

二:打开文件与关闭文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package main

import (

    "fmt"

    "os"

)

func main() {

    path := "d:/abc.txt"

    file, err := os.Open(path)

    if err != nil {

        fmt.Printf("err=%v",err)

        return

    }

    fmt.Println(file)

    defer file.Close()

}

结果

[ `go run os.go` | done ]

    &{0xc000068780}

 由上结果可知,file为指针。

三:读文件操作应用

①:文件读取(适用于大小文件读取)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

package main

import (

    "fmt"

    "os"

    "bufio"

    "io"

)

func main() {

    path := "d:/abc.txt"

    file, err := os.Open(path)

    if err != nil {

        fmt.Printf("err=%v",err)

        return

    }<br>     //创建缓存空间读取文件

    defer file.Close()

    reader := bufio.NewReader(file)

    for {

        str, err := reader.ReadString('\n')

        if err == io.EOF {

            break

        }

        fmt.Printf(str)

    }

}

结果

[ `go run os.go` | done ]

    hello golang

    hello golang

    hello golang

 ②:一次性读取(建议小文件使用)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package main

import (

    "fmt"

    "io/ioutil"

)

func main() {

    path := "d:/abc.txt"

    //ioutil.ReadFile返回[]byte类型;ioutil.ReadFile()底层包含打开和关闭文件操作

    content, err := ioutil.ReadFile(path)

    if err != nil {

        fmt.Printf("读写出错err=%v\r\n", err)

        return

    }

    fmt.Printf("%T\n",content)

    fmt.Println(string(content))

}

结果

[ `go run os.go` | done ]

    []uint8

    hello golang

    hello golang

    hello golang

    hello golang

四:写文件操作

①:os.OpenFile()介绍

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
name:需要打开的文件目录名称
flag

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  // 如果可能,打开时清空文件
)

perm:权限控制
②:创建一个新文件,并写入"hello golang"

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

package main

import (

    "fmt"

    "os"

    "bufio"

)

func main() {

    path := "d:/cw.txt"

    file, err := os.OpenFile(path, os.O_WRONLY | os.O_CREATE, 0666)

    if err != nil {

        fmt.Printf("err=%v", err)

        return

    }

    defer file.Close()

    str := "hello golang"

    //使用缓存方式写入

    writer := bufio.NewWriter(file)

    count, w_err := writer.WriteString(str)

    //需要使用Flush()将写入到writer缓存的数据真正写入到cw.txt文件中

    writer.Flush()

    if w_err != nil {

        fmt.Println("写入出错")

    }else{

        fmt.Printf("写入成功,共写入字节:%v", count)

    }

}

结果

[ `go run os.go` | done ]

    写入成功,共写入字节:12

③:覆盖原有内容

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

package main

import (

    "fmt"

    "os"

    "bufio"

)

func main() {

    path := "d:/cw.txt"

    file, err := os.OpenFile(path, os.O_WRONLY | os.O_TRUNC, 0666)

    if err != nil {

        fmt.Printf("err=%v", err)

        return

    }

    defer file.Close()

    str := "hello world!"

    //使用缓存方式写入

    writer := bufio.NewWriter(file)

    count, w_err := writer.WriteString(str)

    //需要使用Flush()将写入到writer缓存的数据真正写入到cw.txt问卷1中

    writer.Flush()

    if w_err != nil {

        fmt.Println("写入出错")

    }else{

        fmt.Printf("写入成功,共写入字节:%v", count)

    }

}

 

cw.txt已由hello golang变为hello world!

备注:其实O_WRONLY默认就是覆盖之前的内容写入

④:文件内容最加

举例略,将上O_TRUNK改为O_APPEND即可

其他应用不再举例,结合①与②即可。

五:把一个文件内容写入到另一个文件(两个文件都必须存在)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package main

import (

    "fmt"

    "io/ioutil"

)

func main() {

    path1 := "d:/cw.txt"

    path2 := "d:/abc.txt"

    

    content, err1 := ioutil.ReadFile(path1)

    if err1 != nil {

        fmt.Println(err1)

        return

    }

    err2 := ioutil.WriteFile(path2, content, 0666)

    if err2 != nil {

        fmt.Println(err2)

    }

}

 

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

package main

import (

    "fmt"

    "os"

)

func main() {

    path1 := "d:/cw.txt"

    _, err1 := os.Stat(path1)

    if err1 != nil {

        fmt.Println("文件不存在")

        return

    }

    fmt.Println("文件存在")

}

 七:文件拷贝

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package main

import (

    "fmt"

    "io"

    "os"

)

func main() {

    path1 := "d:/cw.txt"

    path2 := "d:/qwer.txt"

    src, _ := os.OpenFile(path1,os.O_RDONLY,0666)

    defer src.Close()

    dsc, _ := os.OpenFile(path2, os.O_RDWR,0666)

    defer dsc.Close()

    //written代表写入的字节

    written, err := io.Copy(dsc, src)

    if err != nil {

        fmt.Println(err)

        return

    }

    fmt.Println(written)

}

结果

[ `go run os.go` | done ]

    12

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值