golang

19-文件操作

2018-09-28  本文已影响271人  极客江南

文件的打开和关闭

type file struct {
    pfd     poll.FD
    name    string
    dirinfo *dirInfo 
}
type File struct {
    *file // os specific
}
package main
import (
    "fmt"
    "os"
)

func main() {
    // 1.打开一个文件
    // 注意: 文件不存在不会创建, 会报错
    // 注意: 通过Open打开只能读取, 不能写入
    fp, err := os.Open("d:/lnj.txt")
    if err != nil{
        fmt.Println(err)
    }else{
        fmt.Println(fp)
    }

    // 2.关闭一个文件
    defer func() {
        err = fp.Close()
        if err != nil {
            fmt.Println(err)
        }
    }()
}

文件读取

package main

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

func main() {
    // 1.打开一个文件
    // 注意: 文件不存在不会创建, 会报错
    // 注意: 通过Open打开只能读取, 不能写入
    fp, err := os.Open("d:/lnj.txt")
    if err != nil{
        fmt.Println(err)
    }else{
        fmt.Println(fp)
    }

    // 2.关闭一个文件
    defer func() {
        err = fp.Close()
        if err != nil {
            fmt.Println(err)
        }
    }()

    // 3.读取指定指定字节个数据
    // 注意点: \n也会被读取进来
    //buf := make([]byte, 50)
    //count, err := fp.Read(buf)
    //if err != nil {
    //  fmt.Println(err)
    //}else{
    //  fmt.Println(count)
    //  fmt.Println(string(buf))
    //}

    // 4.读取文件中所有内容, 直到文件末尾为止
    buf := make([]byte, 10)
    for{
        count, err := fp.Read(buf)
        // 注意: 这行代码要放到判断EOF之前, 否则会出现少读一行情况
        fmt.Print(string(buf[:count]))
        if err == io.EOF {
            break
        }
    }
}
package main

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

func main() {
    // 1.打开一个文件
    // 注意: 文件不存在不会创建, 会报错
    // 注意: 通过Open打开只能读取, 不能写入
    fp, err := os.Open("d:/lnj.txt")
    if err != nil{
        fmt.Println(err)
    }else{
        fmt.Println(fp)
    }

    // 2.关闭一个文件
    defer func() {
        err = fp.Close()
        if err != nil {
            fmt.Println(err)
        }
    }()

    // 3.读取一行数据
    // 创建读取缓冲区, 默认大小4096
    //r :=bufio.NewReader(fp)
    //buf, err := r.ReadBytes('\n')
    //buf, err := r.ReadString('\n')
    //if err != nil{
    //  fmt.Println(err)
    //}else{
    //  fmt.Println(string(buf))
    //}

    // 4.读取文件中所有内容, 直到文件末尾为止
    r :=bufio.NewReader(fp)
    for{
        //buf, err := r.ReadBytes('\n')
        buf, err := r.ReadString('\n')
        fmt.Print(string(buf))
        if err == io.EOF{
            break
        }
    }
}
package main

import (
    "fmt"
    "io/ioutil"
)

func main() {

    filePath := "d:/lnj.txt"
    buf, err := ioutil.ReadFile(filePath)
    if err !=nil {
        fmt.Println(err)
    }else{
        fmt.Println(string(buf))
    }
}

文件创建和写入

package main

import (
    "fmt"
    "os"
)

func main() {

    // 1.创建一个文件
    fp, err := os.Create("d:/lnj.txt")
    if err != nil{
        fmt.Println(err)
    }
    // 2.关闭打开的文件
    defer func() {
        err := fp.Close()
        if err != nil {
            fmt.Println(err)
        }
    }()
    // 2.往文件中写入数据
    // 注意: Windows换行是\r\n
    bytes := []byte{'l','n','j','\r','\n'}
    fp.Write(bytes)
    
    fp.WriteString("www.it666.com\r\n")
    fp.WriteString("www.itzb.com\r\n")
    // 注意: Go语言采用UTF-8编码, 一个中文占用3个字节
    fp.WriteString("李南江")
}
package main

import (
    "fmt"
    "os"
)

func main() {

    // 注意点: 第三个参数在Windows没有效果
    // -rw-rw-rw- (666)   所有用户都有文件读、写权限。
    //-rwxrwxrwx (777)  所有用户都有读、写、执行权限。
    // 1.打开文件
    //fp, err := os.OpenFile("d:/lnj.txt", os.O_CREATE|os.O_RDWR, 0666)
    fp, err := os.OpenFile("d:/lnj.txt", os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println(err)
    }
    // 2.关闭打开的文件
    defer func() {
        err := fp.Close()
        if err != nil {
            fmt.Println(err)
        }
    }()

    // 注意点:
    // 如果O_RDWR模式打开, 被打开文件已经有内容, 会从最前面开始覆盖
    // 如果O_APPEND模式打开, 被打开文件已经有内容, 会从在最后追加
    // 3.往文件中写入数据
    bytes := []byte{'l','n','j','\r','\n'}
    fp.Write(bytes)
    fp.WriteString("www.it666.com\r\n")
}
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    // 1.打开文件
    fp, err := os.OpenFile("d:/lnj.txt", os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println(err)
    }
    // 2.关闭打开的文件
    defer func() {
        err := fp.Close()
        if err != nil {
            fmt.Println(err)
        }
    }()

    // 3.创建缓冲区
    w := bufio.NewWriter(fp)

    // 4.写入数据到缓冲区
    bytes := []byte{'l','n','j','\r','\n'}
    w.Write(bytes)
    w.WriteString("www.it666.com\r\n")

    // 5.将缓冲区中的数据刷新到文件
    w.Flush()
}
package main

import (
    "fmt"
    "io/ioutil"
)

func main() {

    // 1.写入数据到指定文件
    data := []byte{'l','n','j','\r','\n'}
    err := ioutil.WriteFile("d:/abc.txt", data, 0666)
    if err != nil {
        fmt.Println(err)
    }else{
        fmt.Println("写入成功")
    }
}

判断文件是否存在

type FileInfo interface {
    Name() string       // 文件的名字(不含扩展名)
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{}   // 底层数据来源(可以返回nil)
}
package main

import (
    "fmt"
    "os"
)

func main() {

    info, err := os.Stat("d:/lnj.txt")
    if err == nil {
        fmt.Println("文件存在")
        fmt.Println(info.Name())
    }else if os.IsNotExist(err) {
        fmt.Println("文件不存在")
    }else{
        fmt.Println("不确定")
    }
}

练习

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {

    // 1.读取一个文件
    buf, err := ioutil.ReadFile("d:/lnj.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 2.写入读取的数据到另一个文件
    err =ioutil.WriteFile("d:/abc.txt", buf, 0666)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("拷贝完成")

}
package main

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

func main() {

    // 1.定义拷贝文件的路径
    scrPath := "D:/a.png"
    destPath := "E:/b.png"
    // 2.打开被拷贝文件
    fr, err := os.Open(scrPath)
    if err != nil {
        fmt.Println(err)
        return
    }
    // 3.关闭打开文件
    defer func() {
        err := fr.Close()
        if err != nil{
            fmt.Println(err)
        }
    }()
    // 4.创建读取缓冲区
    r := bufio.NewReader(fr)

    // 1.创建写入文件
    fw, err := os.Create(destPath)
    if err != nil {
        fmt.Println(err)
        return
    }
    // 2.关闭打开文件
    defer func() {
        err := fw.Close()
        if err != nil{
            fmt.Println(err)
        }
    }()
    // 3.创建写入缓冲区
    w := bufio.NewWriter(fw)
    // 4.利用系统copy函数完成拷贝
    count, err := io.Copy(w, r)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(count)
    fmt.Println("拷贝完成")
}
上一篇下一篇

猜你喜欢

热点阅读