golang 文件操作

本文详细介绍了Golang中文件基础操作、读写文件内容的方法,包括带缓冲的读写、一次性读取、写入文件(创建、覆盖、追加)、文件存在检查,以及图片/视频文件复制。涵盖了文件操作的完整流程和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.文件基础操作

package main

import(
	"fmt"
	"os"
)
func main(){
	//打开文件
	file , err := os.Open("d:/test.txt")

	if err != nil {
		fmt.Println("file错误信息:",err)
	} else {
		//输入内容 返回的是一个指针
		fmt.Printf("file = %v",&file)
		//结果:file = 0xc000006028
	}
	
	//关闭文件
	err = file.Close()
	if err != nil{
		fmt.Println("file错误信息:",err)
	}

}

2.读取文件内容并展示

  1.带缓冲适用于读取较大文件使用

package main

import(
	"fmt"
	"os"
	"bufio"
	"io"
)
func main(){
	//打开文件
	file , err := os.Open("d:/test.txt")

	if err != nil {
		fmt.Println("file错误信息:",err)
	} 

	//当函数退出时,及时关闭file 
	//使用 defer 内置函数 当函数退出时才会调用,要及时关闭否则会内存泄露
	defer file.Close()


	//创建一个 *Reader  是带缓存的 适用于读取较大文件
	/*
	const {
		defaultBusSize = 4096 //默认的缓存为4096
	}
	*/
     reader := bufio.NewReader(file)
     //循环读取文件信息
	 for {
		 str,err := reader.ReadString('\n')// 读到一个换行就结束
         if err == io.EOF { //io.EOF 表示文件的末尾
            break
		 }
		 //输出内容
		 fmt.Print(str)
		 /*
		 学习golang语言中
		 学习到读取文件
		 还用一小部分就学习完成了
		 文件读取结束...
		 */
	 }
	 fmt.Println("文件读取结束...")
}

      2.一次性读取 适用于读取较小文件使用

package main

import(
	"fmt"
	"io/ioutil"
)

func main(){
	//使用ioutil.ReadFile 一次性读取
	file := "d:/test.txt"
	content, err := ioutil.ReadFile(file)
	if err != nil {
		fmt.Printf("read file err=%v",err)
	}

	//把读取到的内容显示到终端
	// fmt.Printf("%v",content)//返回的是[]byte类型 所以需要用string转换一下
	fmt.Printf("%v",string(content))
	/*
	学习golang语言中        
	学习到读取文件
	还用一小部分就学习完成了
	*/

	//代码中没有显示Open文件,所以也不需要显示Close文件 
	//因为 Open和Close文件已经封装到 ioutil.ReadFile 函数内部了
}

3.写入文件

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

     1.创建一个文件写入 hello,Gardon

package main

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

func main(){
   //1.创建一个新文件,写入内容 hello,Gardon
   //1.打开文件 d:/adc.txt
   filePath := "d:/adc.txt"
   file , err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777) //参数3只要在linux系统下才会生效
   if err != nil {
	   fmt .Printf("open file err=%v",err)
	   return
   }

   //及时关闭file句柄 避免文件泄露
   defer file.Close()

   //准备写入内容
   str := "hello,Gardon\r\n"
   //写入时,使用带缓存的 *Writer
   writer := bufio.NewWriter(file)
   for i := 0; i < 5; i++ {
	   writer.WriteString(str)
   }

   //因为iwriter是带缓存,因此在调用WriterString方法时,其实内容是先写入
   //到缓存的,所以需要调用Flush方法,将缓存的数据真正写入到文件中
   writer.Flush()
}

结果

       2.打开一个存在的文件 ,将原来的内容覆盖

  os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777)

//将O_CREATE 改为 O_TRUNC即可 流程是一样的

        3.打开一个存在的文件 ,在原来的内容追加新的内容

 file , err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777)

//将O_CREATE 改为 O_APPEND即可 流程是一样的

        4.打开一个存在的文件 ,将原来的内容读出显示在终端,请求追加内容

package main

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

func main(){
   //1.创建一个新文件,写入内容 hello,Gardon
   //1.打开文件 d:/adc.txt
   filePath := "d:/adc.txt"
   file , err := os.OpenFile(filePath,os.O_RDWR | os.O_APPEND ,0777) //参数3只要在linux系统下才会生效
   if err != nil {
	   fmt .Printf("open file err=%v",err)
	   return
   }

   //及时关闭file句柄 避免文件泄露
   defer file.Close()
   
   //先读取原来的内容并在终端显示
   reader := bufio.NewReader(file)
   //循环读取文件信息
	 for {
      str,err := reader.ReadString('\n')// 读到一个换行就结束
        if err == io.EOF {  //io.EOF 表示文件的末尾
           break
      }
      //输出内容
      fmt.Print(str)
   }

   //准备写入内容
   str := "hello,Gardon\r\n"
   //写入时,使用带缓存的 *Writer
   writer := bufio.NewWriter(file)
   for i := 0; i < 5; i++ {
	   writer.WriteString(str)
   }

   //因为iwriter是带缓存,因此在调用WriterString方法时,其实内容是先写入
   //到缓存的,所以需要调用Flush方法,将缓存的数据真正写入到文件中
   writer.Flush()
}

案例:将A文件内容 导入到B文件

方式1:

package main

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

func main(){
	//将a.txt 文件内容 导入 b.txt文件中

	//打开a.txt文件
	url := "d:/a.txt"
	content, err := ioutil.ReadFile(url)
	if err != nil {
		fmt.Printf("read file err=%v",err)
	}
	//输出结果
	// fmt.Printf("%v",string(content))



	//获取结果
    str1 := string(content)

	filePath := "d:/b.txt"
	file , err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0777) //参数3只要在linux系统下才会生效
    if err != nil {
	   fmt .Printf("open file err=%v",err)
	   return
    }

	//及时关闭file句柄 避免文件泄露
	defer file.Close()

	//写入时,使用带缓存的 *Writer
	writer := bufio.NewWriter(file)
	writer.WriteString(str1)
 
	//因为iwriter是带缓存,因此在调用WriterString方法时,其实内容是先写入
	//到缓存的,所以需要调用Flush方法,将缓存的数据真正写入到文件中
	writer.Flush()
}

方式2:

package main

import(
	"fmt"
	"io/ioutil"
)

func main(){
	//将a.txt 文件内容 导入 b.txt文件中

	//打开a.txt文件
	file1Path := "d:/a.txt"
	file2Path := "d:/b.txt"
	data, err := ioutil.ReadFile(file1Path)
	if err != nil {
		fmt.Printf("read file err=%v",err)
	}
	//输出结果
	// fmt.Printf("%v",string(data))

    err = ioutil.WriteFile(file2Path,data,0777)
	if err != nil {
		fmt.Printf("write file err=%v",err)
	}
}

      5.文件是否存在

package main

import(
	"fmt"
	"os"
)

//判断文件是否存在, true 存在  false 不存在
func PathExists(path string) (bool,error){
	_,err := os.Stat(path)
	if err == nil {
		return true,nil
	}

	if os.IsNotExist(err){
		return false,nil
	}

	return false,nil
}

func main(){
	file1Path := "d:/adc.txt"
	a,e := PathExists(file1Path)
	fmt.Printf("a=%v,e=%v",a,e)

}

   6.将图片/视频/音乐 cp到指定文件

package main

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

//编写一个方法封装 dstFileName 目标目录  srcFileName 原文件
func CopyFile(dstFileName string,srcFileName string) (written int64,err error){
	//获取原文件的Reader
	srcFile , err := os.Open(srcFileName)
	if err != nil{
		fmt.Printf("open file err=%v\n",err)
	}
	reader := bufio.NewReader(srcFile)
	//关闭资源
	defer srcFile.Close()

    //打开 dstFileName 不存在目录就创建
	dstFile , err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE,0777)
	if err != nil {
		fmt.Printf("open file err=%v",err)
	}
    //通过dstFile,获取到Writer
	writer := bufio.NewWriter(dstFile)
	defer dstFile.Close()

	return io.Copy(writer,reader)
}

func main(){
	srcFileName := "d:/aaaaa.jpg"
	dstFileName := "d:/go/aaaaa.jpg"
   _,err := CopyFile(dstFileName,srcFileName)
   if err == nil {
	   fmt.Println("copy成功")
   } else {
	   fmt.Printf("copy失败 err=%v",err)
   }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值