非零基础自学Golang 第11章 文件操作 11.1 目录基本操作 11.1.1 列目录

news2024/9/24 20:21:52

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第11章 文件操作
        • 11.1 目录基本操作
          • 11.1.1 列目录

第11章 文件操作

计算机文件是以硬盘为载体的信息存储集合,文件可以是文本、图片、程序等。在编写程序时,我们经常会和文件打交道,比如从文件读取信息,保存程序结果、程序状态等。

实际上,在前面的章节中,我们已经多次使用了文件,如源代码文件、编译后的可执行文件。从现在开始,我们将要学习如何使用程序去操作处理文件。

文件通常被分为两类:

  • 文本文件
  • 二进制文件。

所有你能用记事本打开并正常显示的文件都可以叫作文本文件,而像图片、可执行程序、压缩包等文件叫作二进制文件。

11.1 目录基本操作

计算机系统为了更好地管理文件,便使用了目录。目录是存放文件的地方,为树形层次结构。

目录在不同系统中存在部分差异,操作系统主要分为Windows和Unix两类,我们日常使用的便是Windows系统

Windows文件系统的特点是分盘,每个盘符有自己的根目录,形成多个树形并排结构,也就是我们常说的C盘、D盘等。Unix类文件系统只有一个根目录,也就是“/”。需要注意的是,Windows的目录不区分大小写,也就是说,“C:\windows”和“C:\WINDOWS”表示的是同一个目录,而Unix系统是区分大小写的

【提示】

Unix系统是1969年AT&T公司在美国新泽西州开发的,大多数的操作系统都受到了Unix的启发,如苹果操作系统Mac OS和开源的Linux系统都是基于Unix发展起来的。

11.1.1 列目录

计算机的文件处理主要会用到Go语言提供的I/O操作库,为了方便开发者使用,Go语言将I/O操作封装在了如下几个包中:

  • io——为IO原语(I/O primitives)提供基本的接口。
  • io/ioutil——封装一些实用的I/O函数。【很多函数已经 弃用了】【2022年12 月4 日】
  • fmt——实现格式化I/O,类似于C语言中的printf和scanf。
  • bufio——实现带缓冲I/O。

我们最常用的I/O操作库是“fmt”,即控制台的输入输出,基本每个程序都离不开这个库,相=信大家通过前面章节的学习已经能熟练使用它了。

本章重点介绍“io/ioutil”这个库,虽然io包提供了不少函数方法,但有时候使用起来并不是那么方便。

为此,标准库中提供了一些更加常用、方便的I/O操作函数,将其封装在“io/ioutil”这个库中。

但是现在,很多函数都 改到os 和 io库中了

https://pkg.go.dev/io/ioutil

在这里插入图片描述

在这里插入图片描述

【提示】

I/O(Input/Output),即输入、输出操作。我们编写的程序除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身的数据发送到外界。比如我们编写的程序想读取一个文本文件,又或者我们想将程序中的某些数据写入到一个文件中,这时我们就要使用输入与输出。

想要读取一个目录的内容,可以使用io/ioutil库中的ReadDir方法,此方法返回一个有序列表,列表内容是dirname指定的目录的目录信息。

**弃用:**从 Go 1.16 开始,os.ReadDir 是一个更有效和正确的选择:它返回 fs.DirEntry 的列表而不是 fs.FileInfo,并且在读取目录中途出错的情况下返回部分结果。

func ReadDir(dirname string) ([]os.FileInfo, error)

我们尝试使用这个方法获取“C:\Users”(Windows系统使用“\”作为路径分隔符,“\”表示字符串中的转义)目录下的所有文件信息,并打印出文件名(包括文件夹名)。

[ 动手写 11.1.1]

package main

import (
   "fmt"
   "io/ioutil"
)

func main() {

   dir, err := ioutil.ReadDir("C:\\Users")

   if err != nil {
      fmt.Println(err)
   }

   for _, file := range dir {
      fmt.Println(file.Name())
   }
}

运行结果

在这里插入图片描述

动手写11.1.1获取了“C:\Users”目录下的所有文件名,但此时我们并不知道哪些是文件,哪些是目录。

我们看到函数ReadDir的返回信息是“[]os.FileInfo”,也就是os.FileInfo的一个数组。而os.FileInfo的定义可以在源码中找到:

type FileInfo interface {
 	Name() string // 文件名称
 	Size() int64 // 文件的长度(单位字节)
 	Mode() FileMode // 文件打开模式
 	ModTime() time.Time // 文件的修改时间
 	IsDir() bool // 是否是文件夹
 	Sys() interface{} // 基础数据源
}

通过os.FileInfo的IsDir属性就可以判断出该文件是否是一个文件夹。

我们可以将列目录这个操作封装成一个函数。

[ 动手写 11.1.2 ]

package main

import (
   "fmt"
   "io/ioutil"
)

// 获取指定目录下的所有文件, 不进入下一级目录搜索
func ListDir(dirPath string) error {

   dir, err := ioutil.ReadDir(dirPath)
   if err != nil {
      return err
   }

   for _, fi := range dir {
      if fi.IsDir() { //忽略目录
         fmt.Println("目录: " + fi.Name())
      } else {
         fmt.Println("文件: " + fi.Name())
      }
   }
   
   return nil
}

func main() {
   
   ListDir("C:\\Users")
   
}

运行结果

在这里插入图片描述

有时候可能需要获取一个目录下的所有文件名(包含子文件夹内的所有文件),也就是递归遍历一个文件夹内的所有文件。

Go标准库提供了一个更加方便的操作函数,这个函数位于path/filepath库中。

func Walk(root string, walkFn WalkFunc) error

Walk函数会遍历root指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用walkFn,包括root自身。

所有访问文件/目录时遇到的错误都会传递给walkFn过滤。

文件是按词法顺序遍历的,这让输出显得更漂亮,但也导致处理非常大的目录时效率会降低。Walk函数不会遍历文件树中的符号链接(快捷方式)文件包含的路径。

[ 动手写 11.1.3]

package main

import (
   "fmt"
   "os"
   "path/filepath"
)

// 获取指定目录下及所有子目录下的所有文件
func WalkDir(path string) {

   err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
      if f == nil {
         return err
      }
      if f.IsDir() {
         return nil
      }
      println(path)
      return nil
   })

   if err != nil {
      fmt.Printf("filepath.Walk() returned %v\n", err)
   }
}

func main() {

   WalkDir("C:\\Windows\\Temp")
}

访问这个目录要管理员权限,可以先自己手动打开一下,再运行程序

运行结果

在这里插入图片描述

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

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

相关文章

推送github一直超时以及输入密码提示2021年8月以后密码不能用解决

最近推送github常常出现443端口超时,查询了很多办法最后用了如下方法解决 首先电脑设置里面搜索代理服务器设置,记住这个端口 用上面的地址和端口运行如下命令 git config --global http.proxy http://127.0.0.1:31181 git config --global https.pro…

小学生C++画图 Go C 编程 第8课 魔法计时器(魔法学院的奇幻之旅 Go C编程绘图)

Goc编程第一课 Goc编程第一课_哔哩哔哩_bilibili Goc编程第一课扩展加复习 Goc编程第一课扩展加复习_哔哩哔哩_bilibili Goc编程第二课 Goc编程第二课_哔哩哔哩_bilibili Goc编程第三课 Goc编程第三课_哔哩哔哩_bilibili Goc编程第四课 Goc编程第四课_哔哩哔哩_bilibili G…

JSCharting JavaScript 3.3.X 12/17/2022 Crack

JSCharting JavaScript 图表库 每个 JSCharting 许可证包括全套 150 多种高级图表类型以及交互式股票图表、无缝网格和日历支持、JavaScript 地图、甘特图、JavaScript 组织结构图和微型图表,企鹅Ω578867473。 画廊 在每台设备上满足每一种需求的图表类型! 包括条形…

【前端开发学习】6.MySQL

文章目录1 MySQL 指令1.1 数据库管理(文件夹)1.2 数据表管理(文件)1.3 数据行操作总结2 案例:员工管理2.1 创建表结构2.2 Python 操作 MySQL1. 创建数据2. 查询数据3. 删除4. 修改总结3 案例: Flask 前端 …

JVM类加载/双亲委派模型

类加载是一个复杂的过程, 那么我们平时说的类加载到底是干啥的呢? 一. 类加载是干啥的 我们都知道Java程序在运行之前, 需要进行编译, 由 .java > .class文件(二进制字节码文件) , 而在运行的时候呢, Java进程(JVM), 就会读取对应的 .class文件, 并且解析他的内容, 在内存…

MySQL --- 函数大全 8

目录 1.返回一个字符串在出现指定数量的分隔符之前的子字符串 SUBSTRING_INDEX() 2.减去时间 SUBTIME() 3.返回总和 SUM() 4.返回函数执行的时间 SYSDATE() 5.返回参数的切线 TAN() 6.提取表达式传递的时间部分 TIME() 7.格式…

ZY_BMP280大气压模块的使用和stm32程序

在搞设计时,用到了大气压模块BMP280,这玩意也不难,主要是淘宝店老板特别der一问三不知,真服了,而且资料里面没有给例程,只有51的例程,利用IIC通信,而且给的例程里面,乱七…

说说 fiber、DOM、ReactElement、实例对象之间的引用关系

大家好,我是前端西瓜哥。 本文探究 fiber、DOM、ReactElement、类组件实例之间的引用关系说明。 React 版本为 18.2.0 原生组件 fiber 原生组件 fiber,指的就是 type 为 “span”、“div” 的 fiber。 fiber.stateNode 指向真实 DOM 节点;n…

Tableau可视化设计案例-03基本表、树形图、气泡图、词云

文章目录Tableau可视化设计案例03基本表、树形图、气泡图、词云1.基本表1.1基本表的使用1.2凸显表的使用1.3二值凸显表2.树形图2.1不同类型酒店数量与评价人数2.2油尖旺不同类型酒店数量与价格3.气泡图与词云3.1不同地区酒店数量与平均价格气泡图3.2动作电影动态气泡图3.3词云图…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.1 序列化

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.1 序列化4.2 Dubbo 常用高级配置 4.2.1 序列化 【一个问题】 两个机器传输数据,如何传输Java对象&#xff…

【YOLOv7-环境搭建⑥】PyTorch安装

下载链接: 来源:(博主)唐三. 链接:https://pan.baidu.com/s/1y6s_EScOqvraFcx7iPSy1g 提取码:m1oa 安装步骤: 在命令指示符中输入以下命令: activate→conda activate py37→输入以下命令&#xff08…

【Python机器学习】密度聚类DBSCAN、OPTICS的讲解及实战演示(附源码 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 划分聚类、密度聚类和模型聚类是比较有代表性的三种聚类思路 1:划分聚类 划分(Partitioning)聚类是基于距离的,它的基本思想是使簇内的点距离尽量近、簇间的点距离尽量远。k…

UOS SDN

​ 文章目录 一.安装相关软件包二.上传并解压opendaylight软件包三.创建拓扑四.下发流表五.启动HTTP-server服务六.截图测试启动 OpenDayLight 的 karaf 程序,并安装如下组件: feature:install odl-restconf feature:install odl-l2switch-switch-ui feature:install odl-…

关于torch.fx的使用

torch.fx 前言 最近在学习一些AI编译器,推理框架的知识,恰好看到了torch.fx这个部分。这个其实在1.10就已经出来了,但是一直不知道,所以花了一点时间学习了这部分的内容。 以下所有的代码基于Mac M1 pytorch 1.13,其…

JavaScript(六):数组

JavaScript数组数组的创建方式数组的索引(不使用内置方法)数组的遍历数组中新增元素(不使用内置方法)数组的检测数组的方法数组的创建方式 1.利用new创建数组 var 数组名 new Array(); 例如: var arr new Array();…

一句话生成角色动画 # text2motion

‍‍‍‍当你和他人谈论人工智能的潜力时,很多人都表露出同样的担心:害怕被取代‍特别在最近几个月,随着生成式人工智能的投资和创新的爆炸性增长,这些不安的感觉更加强烈。机器学习中相对较新的创新,即扩散模型&#…

干货 | 轮廓逼近原理与OpenCV应用(附Python-OpenCV文档下载)

导 读 本文主要介绍轮廓逼近的原理及其在OpenCV中的使用演示。同时可在文末获取Python-OpenCV学习文档pdf。 背景介绍 轮廓逼近的应用比较广泛,如下路线俯视图的简化: 通过迭代平滑一些顶点,从而产出更加线性的路线: 当然这只是轮廓逼近的其中一个应用,后续我们将…

nodejs企业工厂设备维修管理系统vue

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 web简介 4 2.3 B/S结构 4 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 …

【Linux权限】文件权限值,权限掩码,粘滞位,普通用户添加信任名单

目录 1.权限分为2种用户:超级用户,普通用户 2.文件类型和访问权限 ​3.权限掩码(八进制) 4.sudo短暂提升权限 5.粘滞位 1.权限分为2种用户:超级用户,普通用户 超级用户(通常为root&#x…