本文主要是介绍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
- Name = "George"
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 文件-列出目录、复制文件、删除文件、配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!