1、打开和关闭文件

package main
import(
        "fmt"
        "os"
)
func main(){
        //打开文件:
        file,err := os.Open("d:/Test.txt");
        if err != nil {//出错
                fmt.Println("文件打开出错,对应错误为:",err)
        }
        //没有出错,输出文件:
        fmt.Printf("文件=%v",file)
        //.........一系列操作
        //关闭文件:
        err2 := file.Close();
        if err2 != nil {
                fmt.Println("关闭失败")
        }
}

相关:

  • 打开文件,打开成功则返回一个文件对象
//函数
func Open(name string)(file *File,err error)
  • 关闭文件,使文件不能用于读写,返回可能出现的错误
//方法,限File对象调用
func(f *File) Close() error

2、IO

【Go】十六、文件操作-LMLPHP

3、一次性读文件

【Go】十六、文件操作-LMLPHP

  • 使用ioutil包的ReadFile方法,将整个文件读入到内存
  • 不适合大文件
package main
import(
        "fmt"
        "io/ioutil"
)
func main(){
        //读取文件:
        content,err := ioutil.ReadFile("d:/Test.txt")//返回内容为:[]byte,err
        if err != nil {//读取有误
                fmt.Println("读取出错,错误为:",err)
        }
        //如果读取成功,将内容显示在终端即可:
        //fmt.Printf("%v",content)
        fmt.Printf("%v",string(content))
}

在上面的程序中不需要进行 Open\Close操作,因为文件的打开和关闭操作被封装在ReadFile函数内部了

4、带缓冲区的读文件

  • 带缓冲区
  • 适合读大文件
package main
import(
        "fmt"
        "os"
        "bufio"
        "io"
)
func main(){
        //打开文件:
        file,err := os.Open("d:/Test.txt")
        if err != nil {//打开失败
                fmt.Println("文件打开失败,err=",err)
        }
        //当函数退出时,让file关闭,防止内存泄露:
        defer file.Close()
        //创建一个流:
        reader := bufio.NewReader(file)
        //读取操作:
        for {
                str,err := reader.ReadString('\n')//读取到一个换行就结束
                if err == io.EOF {//io.EOF 表示已经读取到文件的结尾
                        break
                }
                //如果没有读取到文件结尾的话,就正常输出文件内容即可:
                fmt.Println(str)
        }
        //结束:
        fmt.Println("文件读取成功,并且全部读取完毕")
}

5、写入文件

打开文件:
【Go】十六、文件操作-LMLPHP

  • 参数一:文件路径

  • 参数二:文件打开模式,多选用 | 连接
    【Go】十六、文件操作-LMLPHP

  • 参数三:权限控制(Linux下生效,Windows无效)

示例:

package main
import(
        "fmt"
        "os"
        "bufio"
)
func main(){
        //写入文件操作:
        //打开文件:
        file , err := os.OpenFile("d:/Demo.txt",os.O_RDWR | os.O_APPEND | os.O_CREATE,0666)
        if err != nil {//文件打开失败
                fmt.Printf("打开文件失败",err)
                return
        }
        //及时将文件关闭:
        defer file.Close()
        //写入文件操作:---》IO流---》缓冲输出流(带缓冲区)
        writer := bufio.NewWriter(file)
        for i := 0; i < 10;i++ {
                writer.WriteString("你好 Golang\n")
        } 
        //流带缓冲区,要刷新流--->才会真正写入文件中:
        writer.Flush()
}

关于权限,不想算可以:

s :=os.FileMode(0666).String()
fmt.Println(s)

6、文件复制

package main
import(
        "fmt"
        "io/ioutil"
)
func main(){
        //定义源文件:
        file1Path := "d:/Demo.txt"
        //定义目标文件:
        file2Path := "d:/Demo2.txt"
        //对文件进行读取:
        content,err := ioutil.ReadFile(file1Path)
        if err != nil {
                fmt.Println("读取有问题!")
                return
        }
        //写出文件:
        err = ioutil.WriteFile(file2Path,content,0666)
        if err != nil {
                fmt.Println("写出失败!")
        }
}
04-04 10:38