21.2 文件-列出目录、复制文件、删除文件、配置文件

2024-06-16 20:28

本文主要是介绍21.2 文件-列出目录、复制文件、删除文件、配置文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 列出目录

io/ioutil包通过ReadDir函数提供了访问目录的功能。该函数接受一个字符串形式的目录路径参数,返回该目录下按名称字典序排列的文件子目录列表。

  • entries, err := ioutil.ReadDir("C:\\") 

entries中都是FileInfo类型变量

文件子目录列表中每个元素都是FileInfo类型的变量,调用它的不同方法可以获得关于文件或子目录的详细信息。

  • Name:名称
  • Size:以字节为单位的大小
  • Mode:类型和权限
  • ModTime:最后修改的时间
  • IsDir:是否是目录
  • Sys:底层数据源
// 列出目录
// ioutil包的ReadDir函数返回参数路径下的目录条目列表,其中每个条目包括:
//    Name - 文件或子目录名
//    Size - 文件大小(字节) 
//    Mode - 权限
// 	  ModTime - 最后修改时间
//    IsDir - 是否是目录
//    Sys - 底层数据源
package main
import ("fmt""io/ioutil""log"
)
func main() {entries, err := ioutil.ReadDir("G:/GoWorkspace/src/hello/file
")if err != nil {log.Fatal(err)}for _, entry := range entries {fmt.Println(entry.Mode(), entry.Name())}
}
// 打印输出:
-rw-rw-rw- createfile_test.go
-rw-rw-rw- file.txt
-rw-rw-rw- openfile_test.go
-rw-rw-rw- readdir_test.go
-rw-rw-rw- writefile_test.go

 2. 复制文件

使用io/ioutil包固然可以执行一些较常见的文件操作,但如果要实现更复杂的功能,则还是需要借助于更低层级的os包。

相对于io/ioutil包,os包更加底层,因此使用该包必须手动关闭打开的文件。

复制文件的基本步骤如下:

  • 打开源文件,获得读取流
    • src, err := os.Open("./main.go")
  • 打开目标文件,获得写入流
    • dst, err := os.OpenFile("./main.txt", os.O_CREATE|os.O_RDWR, 0644)

文件路径参数,访问方式参数(读/写/创建),创建文件时的权限参数;

    • 将数据从读取流复制到写入流
      • copied, err := io.Copy(dst, src)

写入流参数,读取流参数;

返回值:实际复制的字节数,错误码

// 复制文件
// 使用ioutil包的高级文件访问接口无需手动关闭文件,但
// 使用os包的低级文件访问接口必须手动关闭已打开文件
package mainimport ("fmt""io""log""os"
)func main() {src, err := os.Open("./copyfile_test.go")//打开文件,获取读取流if err != nil {log.Fatal(err)}defer src.Close()// 以“可读写”的方式创建main.txt且权限为644,返回写入流dst, err := os.OpenFile("./copyfile.txt", os.O_CREATE|os.O_RDWR, 0644)if err != nil {log.Fatal(err)}defer dst.Close()copied, err := io.Copy(dst, src)if err != nil {log.Fatal(err)}fmt.Println("Success to copy", copied, "bytes")
} 
// 打印输出:
Success to copy 564 bytes

 3.删除文件

os包的Remove函数可用于删除文件或目录,删除过程没有警告,被删除内容亦无法恢复,使用时务必谨慎。

  • err := os.Remove("./RemoveMe/RemoveMe.txt")
  • err = os.Remove("./RemoveMe")

被删除文件或目录必须存在,否则函数会返回错误。

  • The system cannot find the file specified.

被删除目录必须为空,若其中包含文件或子目录,函数会返回错误。

  • The directory is not empty.

更好的做法是对数据进行"软删除",一旦发现误删,即可恢复被删除的数据。

// 删除文件
// os包的Remove函数可用于删除文件或空目录,删除过程没有警告,被删除内容亦无法恢复
package mainimport ("log""os"
)func main() {err := os.Remove("./RemoveMe/RemoveMe.txt")if err != nil {log.Fatal(err)}err = os.Remove("./RemoveMe")if err != nil {log.Fatal(err)}
}

 4.配置文件(json/toml)

在实现各种应用系统的软件项目中,经常需要通过文件来管理配置信息。

  • 程序可能运行于不同的软硬件环境,可将与环境有关的各种参数保存在配置文件中。
  • 开发和生产环境通常存在较大差异,在两个环境间迁移代码时用配置文件加以区分。
  • 使用配置文件还有一个额外的好处,可将其加入版本控制并集成到自动构建过程中。

采用JSON文件保存配置信息是一种卓有成效的标准方式。

  • JSON文件以键值对的形式组织,结构简单,表现丰富,易于阅读,便于书写。
  • JSON文件中的数据,可以很容易地被映射到Go语言结构体变量中,反之亦然。
    • // 1. 先定义结构体。其字段与配置文件一致

type Config struct { ... }

    • // 2. 创建1个配置文件结构体

c := Config{}

    • // 3. 读取配置文件,获得配置文件字符切片

f, err := ioutil.ReadFile("./config.json")

    • // 4. 将其配置信息解析至对应的结构体中

                                err = json.Unmarshal(f, &c)

// 读取JSON格式的配置文件
// 采用JSON文件保存配置信息是一种卓有成效的标准方式
package main
import ("encoding/json""fmt""io/ioutil""log"
)// Config information
type Config struct {Name string `json:"name"`Age  int    `json:"age"`Male bool   `json:"male"`
} func main() {f, err := ioutil.ReadFile("./config.json")if err != nil {log.Fatal(err)}c := Config{}err = json.Unmarshal(f, &c)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", c)
}
// 打印输出:
{Name:George Age:30 Male:true}

 

TOML (Tom's Obvious, Minimal Language)是一种专为存储配置信息而设计的文件格式,相比JSON,其表现力更强,也更容易映射到Go语言数据类型。

  • TOML文件中的配置信息基本采用"键=值"的组织形式,如:
    • Name = "George"
      Age = 30
      Male = true

Go语言标准库并不支持针对TOML数据的编解码操作,需要使用第三方包。

  • 执行如下命令,安装toml包:
    • go get github.com/BurntSushi/toml
  • 读取文件和解码到结构体变量一步完成
    • type Config struct { ... }
    • c := Config{}
    • _, err := toml.DecodeFile("./config.toml", &c)
// TOML配置文件
// TOML是一种专为存储配置信息而设计的文件格式,相比于
// JSON,其表现力更强,也更容易映射到Go语言的数据类型 
// 执行如下命令,安装toml包: 
// go get github.com/BurntSushi/toml 
package main
import ("fmt""log""github.com/BurntSushi/toml"
)
// Config information
type Config struct {Name stringAge  int Male bool 
} 
func main() {c := Config{}_, err := toml.DecodeFile("./config.toml", &c)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", c)
}
// 打印输出:
{Name:George Age:30 Male:true} 

随之Go语言的不断升级,其标准库也随之不断被优化

  • 第三方包未必有这么好的质量保证,它的开发者可能因为精力有限而不再维护它

在Go语言的未来版本中,其标准库会很好地向前兼容

  • 第三方包未必有这么好的可持续性,它的开发者并不承诺新版本一定兼容旧版本

若真的喜爱TOML丰富的表现力,在项目中添加维护良好的依赖也并非坏事

  • 若JSON已经足以满足配置文件的需求,能少一个依赖总还是要好过多一个依赖

 

这篇关于21.2 文件-列出目录、复制文件、删除文件、配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067466

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

禁止复制的网页怎么复制

禁止复制的网页怎么复制 文章目录 禁止复制的网页怎么复制前言准备工作操作步骤一、在浏览器菜单中找到“开发者工具”二、点击“检查元素(inspect element)”按钮三、在网页中选取需要的片段,锁定对应的元素四、复制被选中的元素五、粘贴到记事本,以`.html`为后缀命名六、打开`xxx.html`,优雅地复制 前言 在浏览网页的时候,有的网页内容无法复制。比如「360

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

如何恢复回收站中已删除/清空的文件

回收站清空后如何恢复已删除的文件?是否可以恢复永久删除的文件?或者最糟糕的是,如果文件直接被删除怎么办?本文将向您展示清空回收站后恢复已删除数据的最佳方法。 回收站清空后如何恢复已删除的文件? “回收站清空后我还能恢复已删除的文件吗?” 答案是肯定的,但是在这种情况下您将需要一个  回收站恢复工具 来从回收站中检索文件: 错误/永久删除回收站或任何数字存储设备中的文件 直接删除的文件/

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删