Golang学习+深入(十一)-文件

这篇具有很好参考价值的文章主要介绍了Golang学习+深入(十一)-文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、概述

1、文件

1.1、打开文件和关闭文件

1.2、读文件

1.3、写文件

1.4、判断文件是否存在

1.5、拷贝文件


一、概述

1、文件

文件:文件是数据源(保存数据的地方) 的一种,比如word文档,txt文件,excel文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音...

文件在程序中是以流的形式来操作的。

流:数据在数据源(文件)和程序(内存)之间经历的路径

  • 输入流:数据从数据源(文件)到程序(内存)的路径
  • 输出流:数据从程序(内存)到数据源(文件)的路径
import "os" 包下有File结构体,os.File封装了所有文件相关操作,File是一个结构体。
type File struct {
    // 内含隐藏或非导出字段
}
File代表一个打开的文件对象。
好多方法
func (f *File) Read(b []byte) (n int, err error)
func (f *File) Write(b []byte) (n int, err error)
...等等
对文件操作,会经常使用到os.File结构体。

1.1、打开文件和关闭文件

os.File
func Open(name string) (file *File, err error):Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。
func (f *File) Close() error:Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
package main
import (
	"fmt"
	"os"
)

func main(){
	file,err := os.Open("D:/test.txt")//file:文件对象/文件指针/文件句柄  一个意思
	if err != nil {
		fmt.Println("open file err=",err)
	}
	fmt.Printf("file=%v",file)//file=&{0xc00010e780} //file是一个指针
	err=file.Close()
	if err != nil {
		fmt.Println("Close file err=",err)
	}
}

1.2、读文件

  1. 读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法
package main
import (
	"fmt"
	"os"
	"bufio"
	"io"
)

func main(){
	file,err := os.Open("D:/test.txt")//file:文件对象/文件指针/文件句柄  一个意思
	if err != nil {
		fmt.Println("open file err=",err)
	}
	
	defer file.Close()

	reader := bufio.NewReader(file)
	for{
		str,err := reader.ReadString('\n')
		if err ==io.EOF{
			break
		}
		fmt.Print(str)
	}
	fmt.Println("文件读取结束..")
}
  1. 读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)
import "io/ioutil"
func ReadFile(filename string) ([]byte, error):ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。
===========================
package main
import (
	"fmt"
	"io/ioutil"
)
func main(){
	file := "D:/test.txt"
	content,err :=ioutil.ReadFile(file)//文件的Open和Close在ReadFile内部,不需要我们关闭文件
	if err != nil {
		fmt.Println("read file err=",err)
	}
	fmt.Printf("%v\n",content) //[]byte
	fmt.Printf("%v",string(content))
}

1.3、写文件

  1. 使用os.OpenFile(),bufio.NewWriter()
import "os"
func OpenFile(name string, flag int, perm FileMode) (file *File, err error):OpenFile是一个
更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY
等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,
错误底层类型是*PathError。
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  // 如果可能,打开时清空文件
)
==========================================
package main
import (
	"fmt"
	"os"
	"bufio"
)
func main(){
	filePath := "D:/ok.txt"
	file,err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE ,0666)

	if err != nil {
		fmt.Println("open file err=",err)
		return
	}

	defer file.Close()

	str :="hello,golang\n"
	writer := bufio.NewWriter(file)
	for i:=1;i<=5;i++{
		writer.WriteString(str)  //内容写到缓存中
	}
	writer.Flush()//把缓存内容真正写入到文件中
}

已存在的文件进行清空写入:os.O_TRUNC

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

已存在的文件进行追加写入:os.O_APPEND

file,err := os.OpenFile(filePath,os.O_WRONLY | os.O_APPEND ,0666)

已存在的文件进行读写模式打开:os.O_RDWR

file,err := os.OpenFile(filePath,os.O_RDWR | os.O_APPEND ,0666)
package main
import (
	"fmt"
	"os"
	"bufio"
)

func main(){
	filePath := "D:/ok.txt" //打开已经存在的文件
	file,err := os.OpenFile(filePath,os.O_WRONLY | os.O_TRUNC ,0666)

	if err != nil {
		fmt.Println("open file err=",err)
		return
	}

	defer file.Close()

	str :="hello,world!\r\n"
	writer := bufio.NewWriter(file)
	for i:=1;i<=5;i++{
		writer.WriteString(str)  //内容写到缓存中
	}
	writer.Flush()//把缓存内容真正写入到文件中
}
  1. 将一个文件的内容写入到另一个文件,这两个文件已经存在了,使用ioutil.ReadFile/ioutil.WriteFile完成写文件的任务
//文件从file1Path写到file2Path
package main
import (
	"fmt"
	"io/ioutil"
)

func main(){
	file1Path := "D:/ok.txt" 
	file2Path := "E:/kkk.txt" 
	data,err :=ioutil.ReadFile(file1Path)
	if err != nil {
		fmt.Println("read file err=",err)
		return
	}
	
	err =ioutil.WriteFile(file2Path,data,0666)
	if err != nil {
		fmt.Println("write file err=",err)
		return
	}
}

1.4、判断文件是否存在

Golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断

  1. 如果返回的错误为nil,说明文件或文件夹存在
  2. 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
  3. 如果返回的错误为其他类型,则不确定是否存在
func Stat(name string) (fi FileInfo, err error):Stat返回一个描述name指定的文件对象的FileInfo。
package main
import (
	"fmt"
	"os"
)
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,err
}

func main(){
	filePath := "D:/ok.txt"
	b,err:=PathExists(filePath)
	fmt.Printf("b=%v,err=%v",b,err)
}

1.5、拷贝文件

将图片/电影/mp3拷贝到另外一个文件

import "io"
func Copy(dst Writer, src Reader) (written int64, err error):将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
====================================
package main
import (
	"fmt"
	"os"
	"bufio"
	"io"
)
//从srcFileName拷贝到destFileName
func CopyFile(destFileName string,srcFileName string)(written int64, err error){
	srcFile,err := os.Open(srcFileName)
	if err != nil {
		fmt.Println("open file err=",err)
		return
	}
	defer srcFile.Close()

	reader := bufio.NewReader(srcFile)

	destFile,err := os.OpenFile(destFileName,os.O_WRONLY | os.O_CREATE,0666)
	if err != nil {
		fmt.Println("open file err=",err)
		return
	}
	writer := bufio.NewWriter(destFile)
	defer destFile.Close()
	return io.Copy(writer,reader)
}
func main(){
	file1Path := "D:/ok.txt" 
	file2Path := "E:/ok1.txt" 
	CopyFile(file2Path,file1Path)

	file3Path := "D:/test.jpg" 
	file4Path := "E:/test1.jpg" 
	CopyFile(file4Path,file3Path)
}

Golang学习+深入(十二)-命令行参数/Json/单元测试

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!文章来源地址https://www.toymoban.com/news/detail-412889.html

到了这里,关于Golang学习+深入(十一)-文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx目录结构简介:深入理解Nginx的默认文件和目录

    第一章 Nginx的默认目录结构 当你安装Nginx后,它的默认目录结构如下: 让我们逐个了解这些目录和文件的作用。 第二章 conf目录 conf目录包含了Nginx的配置文件,其中nginx.conf是Nginx主配置文件,它包含了所有全局的Nginx配置项。mime.types文件包含了MIME类型的定义,它告诉Nginx如

    2024年02月13日
    浏览(62)
  • 文件管理大师:深入解析Linux的文件与目录操控

    目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文件 touch 一次性创建多

    2024年02月19日
    浏览(40)
  • 学习笔记三十一:k8s安全管理:认证、授权、准入控制概述SA介绍

    认证基本介绍:kubernetes主要通过APIserver对外提供服务,那么就需要对访问apiserver的用户做认证,如果任何人都能访问apiserver,那么就可以随意在k8s集群部署资源,这是非常危险的,也容易被黑客攻击渗透,所以需要我们对访问k8s系统的apiserver的用户进行认证,确保是合法的符

    2024年02月06日
    浏览(39)
  • 深入了解 ReadDirectoryChangesW 并应用其监控文件目录

    简介 其函数原型为: hDirectory:要监视的目录的句柄。 lpBuffer:接收变更通知的缓冲区。 nBufferLength:缓冲区的大小。 bWatchSubtree:如果为 TRUE,则监视目录树中的所有目录。如果为 FALSE,则仅监视指定的目录。 dwNotifyFilter:指定要监视的变更类型,可以是文件夹或文件的新增

    2024年01月16日
    浏览(36)
  • 【Spring(十一)】万字带你深入学习面向切面编程AOP

      今天我们来学习 AOP ,在最初我们学习Spring时说过Spring的两大特征,一个是 IOC ,一个是 AOP ,我们现在要学习的就是这个AOP。   AOP: 面向切面编程 ,一种编程范式,指导开发者如何组织程序结构。   作用:在不惊动原始设计的基础上为其进行 功能增强 。   首先我们先

    2024年01月25日
    浏览(85)
  • 【从零开始学习JAVA | 第四十一篇】深入JAVA锁机制

    目录 前言:          引入: 锁机制:  CAS算法: 乐观锁与悲观锁: 总结: 在多线程编程中,线程之间的协作和资源共享是一个重要的话题。当多个线程同时操作共享数据时,就可能引发数据不一致或竞态条件等问题。为了解决这些问题,Java提供了强大的锁机制,使得

    2024年02月14日
    浏览(54)
  • Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】

    聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合:用以计算一些值,比如:最大值

    2024年01月23日
    浏览(48)
  • Nginx深入:nginx功能模块、目录结构及配置文件详解

    1、Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Events)层,这里有很多 Nginx 必需的全局参数配置。 有关核心功能模块的官方文档为:http://nginx.org/en/docs/ngx_core_module.html 2、标准的 HTTP 功能模块集合

    2024年02月14日
    浏览(47)
  • 【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

    专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮

    2024年02月11日
    浏览(45)
  • 【80天学习完《深入理解计算机系统》】第十一天 3.4 跳转指令

    专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包