Golang中文件目录操作的实现

news2024/11/26 23:37:14

目录

文件

文件目录

文件目录操作

读取文件

一、方法一 (file.Read())

二、方法二 (bufio读取文件)

三、方法三 (ioutil 读取方法)

写入文件

一、方法一

二、方法二

三、方法三 (ioutil写入文件)

复制文件

一、方法一

二、方法二


文件

       Golang中,文件是指计算机中存储数据的实体,文件可以是文本文件、二进制文件、配置文件等。在Go语言中,通过操作文件,我们可以读取文件的内容,写入数据到文件,以及获取文件的属性等。

Golang中的文件可以分为两种类型:文本文件和二进制文件。文本文件是指只包含文本内容的文件,可以用文本编辑器打开进行查看和编辑。而二进制文件是指除文本内容外还包含其他数据的文件,如图片、音频、视频等文件。

在Golang中,文件是以文件流的形式进行操作的,文件流是指将文件中的内容作为一个流来处理的方式,通过读取流来获取文件的内容,通过写入流来向文件中写入数据。


文件目录

在Golang中,文件目录是指计算机文件系统中的文件夹或目录。目录是用于组织和存储文件的一种方式,可以包含文件和其他子目录。

Golang中的文件目录操作基本概念主要涉及文件和目录的创建、打开、读取、写入、删除等操作。

文件路径:文件路径是用于定位文件或目录的字符串。在Go语言中,可以使用绝对路径或相对路径来表示文件路径。绝对路径是从根目录开始的完整路径,而相对路径是相对于当前工作目录的路径。

文件操作:在Go语言中,可以使用os包进行文件操作。常用的文件操作包括创建文件、打开文件、读取文件内容、写入文件内容和关闭文件等。

目录操作:同样在os包中,可以进行目录操作,如创建目录、删除目录、遍历目录等。常用的目录操作函数包括MkdirMkdirAllRemoveRemoveAllReadDir等。

文件信息:通过os包中的函数,可以获取文件的相关信息,如文件大小、修改时间、权限等。常用的文件信息函数包括StatFileInfo等。

文件读写:Go语言中的文件读写操作可以使用os包中的Open函数打开文件,然后使用ReadWrite方法来读取和写入文件内容。还可以使用bufio包提供的缓冲读写方式来提高读写效率。

错误处理:在文件和目录操作过程中,可能会出现各种错误,如文件不存在、权限不足等。在Go语言中,通过错误返回值来处理这些错误,常用的处理方式包括检查错误值、使用defer语句关闭文件和使用log包输出错误信息等。

文件删除:在Go语言中,可以使用os包中的Remove函数删除文件。需要注意的是,删除文件是一个不可逆操作,谨慎使用。

总而言之,Go语言提供了丰富的文件和目录操作函数,可以方便地进行文件和目录的创建、打开、读写和删除等操作。开发者可以根据具体需求使用这些函数来处理文件和目录操作。


文件目录操作

读取文件

一、方法一 (file.Read())

1、只读方式打开文件 file,err := os.Open()

2、读取文件 file.Read()

3、关闭文件流 defer file Close()

package main

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

func main() {
    //只读方式打开当前目录下的main.go文件
	file, err := os.Open("D:/GoLang/go_demo/helloworld/hello.go")
	defer file.Close() //必须关闭文件流
	if err != nil {
		fmt.Println(err)
		return
	}
	//操作文件
	fmt.Println(file) //&{0xc000100780}
	//读取文件里面的内容
	var strSlice []byte
	var tempSlice = make([]byte, 20)
	for {
		n, err := file.Read(tempSlice)
		if err == io.EOF { //err == io.EOF表示读取完毕
			fmt.Println("读取完毕")
			break
		}
		if err != nil {
			fmt.Println("读取失败")
			return
		}
		strSlice = append(strSlice, tempSlice[:n]...) //注意写法
	}
	fmt.Println(string(strSlice)) //强制类型转换
}

成功读取到了文件的地址

二、方法二 (bufio读取文件)

1、只读方式打开文件 file,err := os.Open()

2、创建reader对象 reader := bufio.NewReader(file)

3、ReadString读取文件 line,err := reader.ReadString('\n')

4、关闭文件流 defer file.Close()

package main

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

func main() {
    file, err := os.Open("D:/GoLang/go_demo/helloworld/hello.go")
	defer file.Close() //必须关闭文件流
	if err != nil {
		fmt.Println(err)
		return
	}
	//bufio读取文件
	var fileStr string
	reader := bufio.NewReader(file)
	for {
		line, err := reader.ReadString('\n') //表示一次读取一行
		if err == io.EOF {
			fileStr += line
			break
		}
		if err != nil {
			fmt.Println(err)
			return
		}
		fileStr += line
	}
	fmt.Println(fileStr)
}

三、方法三 (ioutil 读取方法)

打开关闭文件的方法它都封装好了,只需要一句话就可以读取

ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
    byteStr, err := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(byteStr))
}

写入文件

写入文件需要用到os.OpenFile(),其源码为:

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
	testlog.Open(name)
	f, err := openFileNolog(name, flag, perm)
	if err != nil {
		return nil, err
	}
	f.appendMode = flag&O_APPEND != 0

	return f, nil
}

name 要打开的文件名,flag 打开文件的格式,perm 文件权限,一个八进制数 r(读)04 w(写)02 x(执行)01

其中flag分为:

os.O_WRONLY 只写

os.O_CREATE 创建文件

os.O_RDONLY 只读

os.O_RDWR 读写

os.O_TRUNC 清空

os.O_APPEND 追加

一、方法一

1、打开文件 file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)

2、写入文件

file.Write([]byte(str)) //写入字节切片数据

file.WriteString("直接写入的字符串数据") //直接写入的字符串数据

3、关闭文件流 file.Close()

package main

import (
	"fmt"
	"os"
)

func main() {
    file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)
	defer file.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
	file.WriteString("//直接写入的字符串数据")
}

 hello.go中就会被按要求追加

二、方法二

1、打开文件 file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)

2、创建writer对象 writer := bufio.NewWriter(file)

3、将数据写入缓存 writer.WriteString("你好Golang\n")

4、将缓存中的内容写入文件 writer.Flush()

5、关闭文件流 file.Close()

package main

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

func main() {
    file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)
	defer file.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
	writer := bufio.NewWriter(file)
	for i := 0; i < 10; i++ {
		writer.WriteString("//你好Golang" + strconv.Itoa(i) + "\n")
	}
	writer.Flush()
}

按要求追加数据

三、方法三 (ioutil写入文件)

str := "hello Golang"

err := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/hello.go", []byte(str), 0666)

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
    str := "//hello golang"
	err := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/hello.go", []byte(str), 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
}


复制文件

一、方法一

byteStr, err1 := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")

err2 := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/world.go", byteStr, 0666)

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
    byteStr, err1 := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	err2 := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/world.go", byteStr, 0666)
	if err2 != nil {
		fmt.Println(err2)
		return
	}
	fmt.Println("复制文件成功 ")
}

成功复制hello.go中的内容

二、方法二

source, _ := os.Open(srcFileName)

destination, _ := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666)

n, err := source.Read(buf)

destination.Write(buf[:n]);

package main

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

// 编写一个函数,接受两个文件路径 srcFileName 和 dstFileName
func CopyFile(srcFileName string, dstFileName string) (err error) {
	sFile, err1 := os.Open(srcFileName)
	defer sFile.Close()
	dFile, err2 := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666)
	defer dFile.Close()
	if err1 != nil {
		return err1
	}
	if err2 != nil {
		return err2
	}
	var tempSlice = make([]byte, 50)
	for {
		//读取数据
		n, err := sFile.Read(tempSlice)
		if err == io.EOF {
			break
		}
		if err != nil {
			return err
		}
		//写入数据
		if _, err := dFile.Write(tempSlice[:n]); err != nil {
			return err
		}
	}
	return nil
}

func main() {
    srcFile := "D:/GoLang/go_demo/helloworld/hello.go"
	dstFile := "D:/GoLang/go_demo/helloworld/world.go"
	err := CopyFile(srcFile, dstFile)
	if err == nil {
		fmt.Println("拷贝完成")
	} else {
		fmt.Printf("拷贝错误 err = %v", err)
	}
}

成功拷贝

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python异常处理速通

一.异常处理认识 1.基础认识 开发人员在编写程序时&#xff0c;难免会遇到错误&#xff0c;有的是编写人员疏忽造成的语法错误&#xff0c;有的是程序内部隐含逻辑问题造成的数据错误&#xff0c;还有的是程序运行时与系统的规则冲突造成的系统错误&#xff0c;等等。总的来说…

什么是肖特基二极管

普通二极管是由N型半导体和P型半导体接触制成&#xff0c;交界面形成PN结。 肖特基二极管是由N型半导体和金属接触制成&#xff0c;交界面形成肖特基结。 肖特基结的形成主要是因为N型半导体中的电子更容易逸出进入到金属&#xff0c;从而在接触面N型半导体失去电子形成正离子区…

python:绘制GAM非线性回归散点图和拟合曲线

作者&#xff1a;CSDN _养乐多_ 本文将介绍使用python语言绘制广义线性模型&#xff08;Generalized Additive Model&#xff0c;GAM&#xff09;非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。 文章目录 一、GAM非线性回归详解二、代码三、计算RM…

docker 镜像/容器的打包、导出、导入

目录 一、将变动过的容器打包生成新的镜像 二、对镜像进行导出导入 1、将镜像导出为一个镜像img文件 2、将img镜像文件导入&#xff0c;复制出一个完全一样镜像 三、对容器进行导入导出 1、将容器导出为一个镜像tar文件 2、将镜像tar文件导入&#xff0c;生成一个新镜像…

Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

vite构建的项目如何修改element Plus的主题样式

安装element plus 安装icon pnpm install element-plus pnpm install element-plus/icons-vue main.ts配置 icon的使用https://element-plus.gitee.io/zh-CN/component/icon.html#%E7%BB%93%E5%90%88-el-icon-%E4%BD%BF%E7%94%A8 import { createApp } from vue import ./sty…

【工具】vscode的常用插件之git插件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

计算机视觉cv模型最新进展速看:

华为诺亚实验室等研究者提出动态分辨率网络 DRNet 深度卷积神经网络通畅采用精细的设计&#xff0c;有着大量的可学习参数&#xff0c;在视觉任务上实现很高精 确度要求。为了降低将网络部署在移动端成本较高的问题&#xff0c;近来发掘在预定义架构上的冗余 已经取得了巨大的…

Midjourney AI绘画中文教程详解(完整版)模型、命令、参数与各种高级用法

我有一种预感&#xff0c;您一下子看不完这篇内容&#xff0c;您得【收藏】一下&#xff0c;以便下次接着看~~ Midjourney AI绘画中文教程&#xff0c;Midjourney是一款2022年3月面世的AI绘画工具&#xff0c;创始人是David Holz。 只要输入想到的文字&#xff0c;就能通过人…

数据库sqlserver-----触发器的插入,更新和删除

在学习触发器之前&#xff0c;先弄清DDL,DML,DQL,DCL的区别: http://t.csdn.cn/Le3wA 触发器就是当执行某个事件的时候触发另一个事件的执行&#xff0c;根据事件的触发时间可分为 before和after Before与After区别&#xff1a;before&#xff1a;(insert、update)可以对new…

数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

目录 题目描述 输入示例 输出示例 解题思路 解题方法&#xff08;C语言&#xff09; 解析 题目描述 有序的二叉树遍历可以用堆栈以非递归的方式实现。 例如&#xff1a; 假设遍历一个节点数为6的二叉树&#xff08;节点数据分别为1到6&#xff09;时&#xff0c; 堆…

immersive-translate 安装,个人觉得一款超级好用的浏览器翻译插件

immersive-translate 安装&#xff0c;个人觉得一款超级好用的浏览器翻译插件 immersive-translate 是什么Github 地址主要特性立即安装使用 immersive-translate immersive-translate 是什么 Immersive Dual Web Page Translation Extension - 沉浸式双语网页翻译扩展。 Git…

MSP432学习笔记5——外部中断

所用单片机型号&#xff1a;MSP432P401r 今日继续我的MSP432电赛速通之路。 外部中断是个很有用的配置 STM32几乎每个I/O口都能配置复用为外部中断 但MSP432并不是这样。 我经过查阅数据手册发现支持中断的引脚为&#xff1a; P1^0~ P1^7 P3^0~ P3^7 P5^0~ P5^…

【Python习题】Python课程设计的作业分小组完成得分计算(实现代码)

目录 题目思路分析代码实现效果总结 主要内容是校设课程的习题和课外学习的一些习题。 欢迎关注 『Python习题』 系列&#xff0c;持续更新中 欢迎关注 『Python习题』 系列&#xff0c;持续更新中 题目 【题目描述】Python课程设计的作业分小组完成&#xff0c;规定小组成员1…

​Shodan新手入坑指南​

什么是 Shodan&#xff1f; 首先&#xff0c;Shodan 是一个搜索引擎&#xff0c;但它与 Google 这种搜索网址的搜索引擎不同&#xff0c;Shodan 是用来搜索网络空间中在线设备的&#xff0c;你可以通过 Shodan 搜索指定的设备&#xff0c;或者搜索特定类型的设备&#xff0c;其…

【C++】结构体 - 定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体const

文章目录 1. 定义和使用2. 结构体数组3. 结构体指针4. 结构体嵌套结构体5. 结构体做函数参数6. 结构体const 1. 定义和使用 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。 struct 结构体 {结构体成员列表}; 通过结构体创建变量的方法有三种&…

读数据压缩入门笔记02_二进制和熵

1. 十进制 1.1. 现代数学建立在十进制计数系统之上 2. 二进制 2.1. 二进制计数系统的工作原理与十进制计数系统一样&#xff0c;唯一的区别是前者的基数为2&#xff0c;而后者的基数为10 2.2. 数据压缩所做的就是尽可能减少表示特定数据集时所需的二进制位数量 2.3. 给定任…

WASender - Whatsapp server and bulk sender

WASender 是一个 whatsapp 营销平台&#xff0c;它使用 Laravel 和 Node Js 构建。WhatsApp 是世界上最受欢迎的消息应用程序之一&#xff0c;拥有超过 20 亿活跃用户。这使其成为企业接触潜在客户并与现有客户群互动的有吸引力的平台。WASender 客户可以创建多个设备来向他的目…

NLP基础知识(语法语义、LDA、N-gram、词嵌入)

文章目录 本节课大纲Hyper-simplified linguisticsTerm spotting handling negation, uncertaintyML to expand termspre-NN ML to identify entities and relationsLatent Dirichlet Allocation (LDA)Statistical Models of Language: Zipfs lawvector space embeddings base…

Office project 2016安装

哈喽&#xff0c;大家好。今天一起学习的是project 2016的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…