Golang 对文件的增删改查操作
时间:2023-03-21
本文章向大家介绍Golang 对文件的增删改查操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package main
import (
"bufio"
"bytes"
"fmt"
"os"
"os/exec"
"strings"
"text/template"
)
type HostsEntry struct {
IP string
Host string
}
func Add(filepath string, str []HostsEntry) error {
// 定义模板
hostsTmpl := `{{.IP}} {{.Host}}
`
// 准备数据
//hostsEntries := []HostsEntry{
// {IP: "127.0.0.1", Host: "localhost"},
// {IP: "192.168.1.100", Host: "host1.example.com"},
// {IP: "192.168.1.101", Host: "host2.example.com"},
//}
hostsEntries := str
// 打开文件
file, err := os.OpenFile(filepath, os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer file.Close()
// 创建模板
tmpl, err := template.New("host").Parse(hostsTmpl)
if err != nil {
return err
}
// 应用模板并追加到文件
for _, entry := range hostsEntries {
err = tmpl.Execute(file, entry)
if err != nil {
return err
}
}
return nil
}
func Delete(filepath string, str string) error {
file, err := os.OpenFile(filepath, os.O_RDWR, 0644)
if err != nil {
return err
}
defer file.Close()
// 创建一个新的临时文件
tmpFile, err := os.CreateTemp("", "tempfile")
if err != nil {
return err
}
defer tmpFile.Close()
// 扫描文件并删除包含指定字符串的行
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if !strings.Contains(line, str) {
_, err := tmpFile.WriteString(line + "\n")
if err != nil {
return err
}
}
}
// 关闭文件并重命名临时文件
file.Close()
tmpFile.Close()
err = os.Rename(tmpFile.Name(), filepath)
if err != nil {
return err
}
return nil
}
func Modify(filepath, oldstr, newstr string) error {
// 打开文件
file, err := os.OpenFile(filepath, os.O_RDWR, 0644)
if err != nil {
return err
}
defer file.Close()
// 读取文件并存储在内存中
scanner := bufio.NewScanner(file)
var lines []string
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
// 修改所需的行
for i, line := range lines {
if strings.Contains(line, oldstr) {
lines[i] = newstr
break
}
}
// 将修改后的数据写回文件中
file.Truncate(0) // 清空文件内容
file.Seek(0, 0) // 将文件指针移到文件开头
writer := bufio.NewWriter(file)
for _, line := range lines {
fmt.Fprintln(writer, line)
}
writer.Flush()
return nil
}
func Get(filepath, str string) (bool, error) {
// 打开文件
file, err := os.OpenFile(filepath, os.O_RDONLY, 0644)
if err != nil {
return true, err
}
defer file.Close()
// 扫描文件并删除包含指定字符串的行
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if !strings.Contains(line, str) {
return true, nil
}
}
return false, nil
}
func Shellout(command string) (error, string, string) {
const ShellToUse = `bash`
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command(ShellToUse, "-c", command)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return err, stdout.String(), stderr.String()
}
func main() {
hostsEntries := []HostsEntry{
{IP: "127.0.0.1", Host: "localhost"},
{IP: "192.168.1.100", Host: "host1.example.com"},
{IP: "192.168.1.101", Host: "host2.example.com"},
}
Add("drop.conf", hostsEntries)
result, err := Get("drop.conf", "192.168.1.100")
if err != nil {
fmt.Println(err)
}
fmt.Println(result)
Modify("drop.conf", "host1.example.com", "1.1.1.1 host111.example.com")
Delete("drop.conf", "host111.example.com")
err, stdout, stderr := Shellout("ls -al")
if err != nil {
fmt.Println("执行错误")
}
fmt.Println(stdout, stderr)
}
原文地址:https://www.cnblogs.com/dqforgive-sudo/p/17238522.html
- 监控利器之 Prometheus
- C线程同步/异步
- Spring-Security-入门(一):登录与退出
- Shell系列-Shell概述
- sqoop2系统入门之2汇总:用户指南shell命令
- 深入解析golang编程中函数的用法
- MySQL数据库(一):安装MySQL数据库
- Spring Security入门(二):基于数据库验证
- flume搜集日志:如何解决实时不断追加的日志文件及不断增加的文件个数问题
- hduoj-----(2896)病毒侵袭(ac自动机)
- MySQL数据库(二):基本管理
- Golang编程实现生成n个从a到b不重复随机数的方法
- TiDB 在株式会社 FUNYOURS JAPAN 的应用
- MySQL数据库(三):数据类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从图片裁剪来聊聊前端二进制
- 【投稿】刀哥:Rust学习笔记 2
- 【每周一库】- JWT的Rust实现
- 【Rust日报】2020-08-15 Rust Nightly 标准库文档已涵盖了每个关键字
- 【Rust日报】2020-08-16 Cranelift现在可以编译rustc,比LLVM的编译速度快7倍!
- 【Rust日报】2020-08-17 浏览器之外的 WebAssembly
- 前沿技术探讨:Rust语言真的安全吗?
- Java、Go和Rust间的比较
- 【文末送书】非常实用的 Python 技巧
- 消息队列:Rabbitmq如何保证不丢消息
- 二叉树:删除节点
- Go之heap
- 算法篇:树之topk问题
- 一文掌握14种UML图
- 猿实战01——vue后台前端框架搭建