基本介绍

文件是数据源,数据库也是一种特殊的文件。

Go语言中os.File结构体封装了文件的相关操作。

打开和关闭文件


-----打开文件-----
file, err := os.Open("D:/111.txt")
if err != nil{fmt.Println("err = ", err)
}此时file就是一个指针,不包括实际的file对象内容-----关闭文件-----
err = file.Close()
if err != nil{fmt.Println("Close err = ", err)
}

读取文件

第一种方式

适用于文件比较大的情况,带缓冲的读取文件。

使用bufio包。


-----打开文件-----
file, err := os.Open("D:/111.txt")
if err != nil{fmt.Println("err = ", err)
}
-----关闭文件-----
defer file.Close()
使用defer关闭file句柄,defer在函数最后执行-----读取文件-----
创建一个*reader 带缓冲的(内存和硬盘之间存在缓冲区,先放一块数据到缓冲区)
reader := bufio.NewReader(file)
循环读取文件内容
for{str, err := reader.ReadString("\n") //读到一个换行就结束,str中包括换行if err == io.EOF{    io.EOF代表文件结束break    }fmt.Print(str)
}
fmt.Println("文件读取完成")

第二种方式

整个文件直接读入内存。适用于文件比较小的情况。

使用ioutil包。ioutil包目前已经被弃用。

package main
import("fmt""io/ioutil"
)func main(){file := "d:/test.txt"content, err := ioutil.ReadFile(file)if err != nil{fmt.Println("err = ", err)}fmt.Println(content)content是一个byte切片,因此需要转一下格式fmt.Println(string(content))
}

该方式不需要显式读取和关闭文件。

文件写入

 bufio包中的Reader和Writer都是有缓冲的读写数据。

创建文件并进行写入

创建和读取文件使用os包,写入文件使用bufio包。

使用os.Openfile函数进行文件创建。

第一个参数是文件名。

第二个参数是包含以下选项。

第三个参数在linux系统下,win系统下无效,该参数是进行权限控制的。

package mainimport ("bufio""fmt""os"
)func main() {filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)if err != nil {fmt.Println("err = ", err)return}// 关闭文件句柄defer file.Close()writer := bufio.NewWriter(file)for i := 0; i < 5; i++ {writer.WriteString("hello,World!\n")}// WriterString带缓存区的写入// 因此需要writer.Flush()清空缓冲区,将内存写入硬盘writer.Flush()}

打开存在的文件并进行内容覆盖

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

OpenFile函数中的第二个参数os.O_TRUNC代表追加;os.O_WRONLY代表写入。

打开存在文件进行文件追加

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

os.O_APPEND代表追加。 

打开存在文件将内容显示在终端,然后进行文件追加

初始化文件使用os包,读取文件内容使用bufio包,写入文件使用bufio包,

package mainimport ("bufio""fmt""io""os"
)func main() {filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_APPEND|os.O_RDWR, 0666)if err != nil {fmt.Println("err = ", err)return}// 关闭文件句柄defer file.Close()// 读取原来的文件内容,并输出在终端reader := bufio.NewReader(file)for {str, err := reader.ReadString('\n')if err == io.EOF {break}fmt.Print(str)}// 追加写入writer := bufio.NewWriter(file)for i := 0; i < 5; i++ {writer.WriteString("11111\r\n")}// WriterString带缓存区的写入// 因此需要writer.Flush()清空缓冲区,将内存写入硬盘writer.Flush()}

将一个文件内容copy到另一个文件之中

读取文件、写入文件都使用os包。

package mainimport ("fmt""os"
)func main() {file1Path := "d:/abc.txt"file2Path := "e:/111.txt"// 读取源文件内容data, err := os.ReadFile(file1Path)if err != nil {fmt.Println("读取文件失败:", err)return}// 将内容写入目标文件err = os.WriteFile(file2Path, data, 0644)if err != nil {fmt.Println("写入文件失败:", err)return}fmt.Println("文件复制成功")
}

抛开错误处理,就两步,一个读,一个写。

判断文件是否存在

  • 使用os.Star()函数判断是否存在。
import ("os""fmt"
)func checkExist(path string) {fileInfo, err := os.Stat(path)if err != nil {if os.IsNotExist(err) {fmt.Printf("路径 %q 不存在\n", path)} else {fmt.Printf("发生错误: %v\n", err)}return}if fileInfo.IsDir() {fmt.Printf("%q 是一个目录\n", path)} else {fmt.Printf("%q 是一个文件\n", path)}
}

os.Star(Path) 返回值:

  • 如果成功:返回一个os.FileInfo接口,包含文件/目录的信息。
  • 如果失败:返回一个非 nil 的 error。

判断是否存在的标准方式

if os.IsNotExist(err) {// 路径不存在
} else if err != nil {// 其他错误,比如权限不足
}

不能直接使用err == 进行判断,就使用os.IsNotExist()进行判断

 后续使用中一般都是封装成函数进行使用。

文件操作编程实例

1. 编写一个函数,将一个图片拷贝到另一个文件夹中。

func CopyFile(src, dst string) {// 打开源文件srcFile, _ := os.Open(src)defer srcFile.Close()// 创建目标目录(如果不存在)os.MkdirAll(filepath.Dir(dst), 0755)// 创建目标文件dstFile, _ := os.Create(dst)defer dstFile.Close()// 拷贝内容io.Copy(dstFile, srcFile)
}

在这个例子中,srcFile和dstFiled都是*os.File类型

 io.Copy()接受Writer和Reader接口类型,也就是说*os.File类型实现了io.Reader和io.Writer。直接使用没有问题。

2. 统计一个文件中含有多少英文、数字等信息

package mainimport ("bufio""fmt""io""os"
)type CharCount struct {ChCount    int // 记录英文个数NumCount   int // 记录数字的个数SpaceCount int // 记录空格的个数OtherCount int // 记录其他字符的个数
}func main() {filePath := "d:/abc.txt"file, err := os.Open(filePath)if err != nil {fmt.Println(err)return}defer file.Close()var count CharCount// 使用带缓冲的读取// bufio包中是带缓冲的读取,读取之前必须先拿到文件的句柄// os.ReadFile()函数不带缓冲读,不需要打开文件句柄,直接放入文件路径即可reader := bufio.NewReader(file)for {str, err := reader.ReadString('\n')if err == io.EOF {break}for _, v := range str {switch {case v >= 'a' && v <= 'z':fallthrough //穿透处理,直接进入到下一个casecase v >= 'A' && v <= 'Z':count.ChCount++case v == ' ' || v == '\t':count.SpaceCount++case v >= '0' && v <= '9':count.NumCount++default:count.OtherCount++}}}fmt.Println(count)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86412.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86412.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86412.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电力物联网】云–边协同介绍

(꒪ꇴ꒪ )&#xff0c;Hello&#xff0c;我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的技术…

《深入解析 C#(第 4 版)》推荐

《深入解析 C#&#xff08;第 4 版&#xff09;》推荐 在 C# 语言不断演进的技术浪潮中&#xff0c;《深入解析 C#&#xff08;第 4 版&#xff09;》犹如一座灯塔&#xff0c;为开发者照亮探索的道路。无论是经验丰富的老程序员&#xff0c;还是初入 C# 领域的新手&#xff0c…

【网络】Linux 内核优化实战 - net.core.netdev_max_backlog

目录 Linux 内核参数 net.core.netdev_max_backlog 详解一、参数概述二、参数功能与作用2.1 核心功能2.2 网络数据包处理流程 三、查看当前参数值3.1 通过 sysctl 命令3.2 直接读取 /proc/sys 文件 四、修改参数值4.1 临时修改&#xff08;立即生效&#xff0c;重启后失效&…

Nuitka 打包Python程序

文章目录 Nuitka 打包Python程序&#x1f680; **一、Nuitka 核心优势**⚙️ **二、环境准备&#xff08;Windows 示例&#xff09;**&#x1f4e6; **三、基础打包命令****单文件脚本打包****带第三方库的项目** &#x1f6e0;️ **四、高级配置选项****示例&#xff1a;完整命…

自动获取文件的内存大小怎么设置?批量获取文件名和内存大小到Excel中的方法

在对重要数据进行备份或迁移操作前&#xff0c;为确保备份全面无遗漏&#xff0c;且合理规划目标存储设备的空间&#xff0c;会将文件名和内存提取到 Excel。比如&#xff0c;某个部门要将旧电脑中的文件迁移到新服务器&#xff0c;提前整理文件信息&#xff0c;能清晰知道所需…

创建型设计模式——单例模式

单例设计模式 什么是创建型设计模式有哪些创建型设计模式 单例设计模式实现方法饿汉式单例懒汉式单例实现方法 CSDN——C单例模式详解 单例设计模式是一种创建型设计模式 什么是创建型设计模式 创建型设计模式&#xff0c;就是通过控制对象的创建方式来解决设计问题。 有哪…

html 照片环 - 图片的动态3D环绕

html 照片环 - 图片的动态3D环绕 引言一、源码二、图转base64参考链接 引言 效果展示&#xff1a; 一、源码 原始图片的base64编码字符太多了&#xff0c;博客放不下&#xff0c;将图片缩小后的加入html的源码如下&#xff1a; <!DOCTYPE html> <html><hea…

ADIOS2 介绍与使用指南

文章目录 ADIOS2 介绍与使用指南什么是ADIOS2?ADIOS2 的主要特点ADIOS2 核心概念ADIOS2 安装Linux 系统安装Windows 安装 ADIOS2 基本使用C 示例Python 示例 ADIOS2 高级特性并行I/O流模式 ADIOS2 引擎类型性能优化建议总结 ADIOS2 介绍与使用指南 什么是ADIOS2? ADIOS2(Ad…

网络安全 vs 信息安全的本质解析:数据盾牌与网络防线的辩证关系关系

在数字化生存的今天&#xff0c;每一次手机支付、每一份云端文档、每一条医疗记录的背后&#xff0c;都矗立着这两座安全堡垒。理解它们的协同逻辑&#xff0c;不仅是技术从业者的必修课&#xff0c;更是企业构建数字防护体系的底层认知 —— 毕竟当勒索软件同时切断 "护城…

ping-pong操作

常见不匹配的原因 瞬时数据率的差异&#xff1b; 数据顺序的差异&#xff1b; 对比维度PipelineFIFOPing-Pong逻辑复制结构类型时序分级推进&#xff08;寄存器链&#xff09;环形队列&#xff08;缓冲区&#xff09;双缓冲区&#xff08;轮换使用&#xff09;功能块并行&am…

21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路&#xff1a;这里使用的主要数据结构是单链表。该算法采用经典的双指针技术来合并列表。 A dummy node is created; this node does not hold any meaningful value b…

vue3中简单易懂说明nextTick的使用

nextTick(): 等待下一次 DOM 更新刷新的工具方法 重点解释: 当你在 Vue 中更改响应式状态时&#xff0c;最终的 DOM 更新并不是同步生效的&#xff0c;而是由 Vue 将它们缓存在一个队列中&#xff0c;直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少状态改变…

gRPC 相关介绍

介绍 依赖两大技术 HTTP/2 作为传输协议 gRPC 底层用 HTTP/2&#xff0c;它支持&#xff1a; 多路复用&#xff08;在一条 TCP 连接中并行传输多个请求和响应&#xff09;二进制传输&#xff08;更紧凑、高效&#xff09;流式传输&#xff08;客户端流、服务端流、双向流&…

PyTorch 模型镜像下载与安装指南

在国内&#xff0c;由于网络限制&#xff0c;直接从 PyTorch 官方源下载可能会遇到速度慢或无法访问的问题。为了解决这一问题&#xff0c;可以使用国内镜像源来加速下载和安装 PyTorch。 文章目录 安装指定版本的 PyTorch&#xff08;以 CUDA 11.8 为例&#xff09;安装 CPU 版…

2025年SVN学习价值分析

⚖️ 一、SVN的现状与应用场景分析 仍在特定领域发挥作用 传统企业维护场景&#xff1a;在金融、电信、政府等采用集中式开发流程的机构中&#xff0c;许多遗留系统仍使用SVN管理。这些系统往往体量庞大、架构稳定&#xff0c;迁移成本高&#xff0c;因此SVN短期内不会被完全替…

JavaScript中的10种排序算法:从入门到精通

作为前端开发者&#xff0c;排序算法是我们必须掌握的基础知识。无论是在面试中&#xff0c;还是在实际开发中处理数据展示时&#xff0c;排序都是一个常见需求。今天&#xff0c;我将用通俗易懂的方式&#xff0c;带你了解JavaScript中最常见的10种排序算法。 1. 冒泡排序 - …

【微信小程序】6、SpringBoot整合WxJava获取用户手机号

1、手机号快速验证组件 手机号快速验证组件 旨在帮助开发者向用户发起手机号申请&#xff0c;并且必须经过用户同意后&#xff0c;开发者才可获得由平台验证后的手机号&#xff0c;进而为用户提供相应服务。 该能力与手机号实时验证组件的区别为&#xff1a; 手机号快速验证…

redis8.0新特性:原生JSON支持详解

文章目录 一、写在前面二、使用1、基本命令&#xff08;1&#xff09;JSON.SET 设置 JSON 值&#xff08;2&#xff09;JSON.GET 获取 JSON 值&#xff08;3&#xff09;JSON.DEL 删除 JSON 值&#xff08;4&#xff09;JSON.MGET 批量获取&#xff08;5&#xff09;JSON.MSET …

QT网络调试助手开发全指南,软件设计图预研,后续文档跟进补充

网络调试助手 1 TCP网络调试助手 1.1 项目概述 网络相关的一些基础概念学习QTcpServer 学习QTcpClient 学习TextEdit特定位置输入文字颜色学习网络通信相关知识点 复习巩固之前UI控件 程序运行如下图所示 1.2 开发流程 1.3 QTtcp 服务器的关键流程 工程建立&#xff0c;需要在…

网络分层模型与协议体系技术研究报告

网络分层模型是计算机网络体系结构的核心框架&#xff0c;它通过将复杂的网络通信过程分解为多个层次&#xff0c;使网络设计、实现和维护变得更加模块化和标准化。 一、分层模型概念 1、OSI七层模型的详细解析 开放系统互连参考模型&#xff08;OSI/RM&#xff09;是国际标…