首页 > 其他分享 >golang文件和目录操作

golang文件和目录操作

时间:2024-02-25 21:47:55浏览次数:21  
标签:文件 读取 err fmt golang file os 目录

读取文件

通过Read方法读取
import (
	"fmt"
	"os"
)

func main() {
	/*
		打开文件
	*/

	// 以只读的方式打开文件,返回一个文件指针类型的对象和error
	file, err := os.Open("./test.txt")
	// 文件打开操作完之后必须关闭文件流,可以使用defer 延迟关闭
	defer file.Close()

	// err 非nil,说明有错误
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(file) // &{0xc00006a180}

	/*
		读取文件
	*/
  
	// 通过Read方法读取
	// Read参数是一个字节切片,该切片用于接收读取文件的字节
  // 定义接收读取到的文件字节的切片
	var tempSlice = make([]byte, 128) // 128容量表示每次读取多少字节
  
  // 有容量的切片接收字节,可能无法接收全部内容,再定义一个切片,通过循环存储每次读取的内容
	var strSlice []byte
	for {
		// 返回两个参数,第一个是读取到的字节数量,第二个是error
		n, err := file.Read(tempSlice)

		// 由于是一个死循环,当文件读取完毕没有内容读取了,会抛出一个io.EOF错误
		if err == io.EOF {
			fmt.Println("读取完毕")
			break
		}

		if err != nil {
			fmt.Println("读取失败")
			return
		}
		fmt.Printf("读取到了%v字节\n", n)
	   // 把每次读取到的内容追加到strSlice中,每次读取128个字节,可能最后的时候不够128字节,会出现空字节的问题
		// n是每次读取到的字节数,通过[:n]切片获取每次读取成功的字节追加
		strSlice = append(strSlice, tempSlice[:n]...)
	}

	fmt.Println(string(tempSlice)) // 读取到的文件内容,通过string把字节切片转换成文本
  
  

通过bufio读取文件

bufio 是在 file 的基础上封装了一层 API,支持更多的功能

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

func main() {
	/*
		打开文件
	*/

	// 以只读的方式打开文件,返回一个文件指针类型的对象和error
	file, err := os.Open("./test.txt")
	// 文件打开操作完之后必须关闭文件流,可以使用defer 延迟关闭
	defer file.Close()

	// err 非nil,说明有错误
	if err != nil {
		fmt.Println(err)
		return
	}

	// 创建读取对象
	reader := bufio.NewReader(file)

	// 通过for循环读取全部内容
	var allStr string
	for {
		// 通过reader.ReadString读取文件,参数是一个字节类型的分割符,\n表示每次读取一行
		// 返回的是读取到的字符串和err
		str, err := reader.ReadString('\n')

		if err == io.EOF {
			// 标记结束后,可能最后还会有返回值没有拼接上,所以再结束时再拼接一次,,Read不会有该问题
			allStr += str
			fmt.Println("读取完毕")
			break
		}
		if err != nil {
			fmt.Println(err)
			return
		}

		allStr += str

	}
	fmt.Println(allStr)

}

ioutil读取全部文件
// Go 1.16 开始会废弃 io/ioutil 包

import (
	"fmt"
	"io/ioutil"
)

func main() {

	// 读取整个文件,一行一行读取
	// 返回一个字节切片和err
	byteStr, err := ioutil.ReadFile("./test.txt")
	if err != nil {
		return
	}
	fmt.Println(string(byteStr))

}
io.ReadAll读取全部文件

ioutil新版本已废弃,可以使用io.ReadAll代替

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

func main() {

	file, err := os.Open("./test.txt")
	defer file.Close()

	byteStr, err := io.ReadAll(file)
	if err != nil {
		return
	}
	fmt.Println(string(byteStr))

}
 

写入文件

指定模式打开文件

os.Open()以只读的模式打开文件,无法写入文件,可以使用os.OpenFile()以指定模式打开文件

os.OpenFile()接收三个参数:

  1. Name:文件名

  2. falg:打开文件的模式

    • os.O_WRONLY 只写

    • os.O_CREATE 创建文件

    • os.O_RDONLY 只读

    • os.O_RDWR 读写

    • os.O_TRUNC 清空

    • os.O_APPEND 追加

  3. perm:文件权限,一个八进制数。(读)04,(写)02,(执行)01,可以直接用0666、0766表示全部权限

  • image-20240225211025701
func main() {

	// 在./路径下创建test.txt文件、写入、每次打开文件清空之前内容
	file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	defer file.Close()
	fmt.Println(file)
	fmt.Println(err)
	if err != nil {
		return
	}
	
Write WriteString 写入文件

wtite写入字节类型的切片,WriteString写入字符串

import (
	"fmt"
	"os"
)

func main() {

	// 每次在./路径下创建test.txt文件、写入模式、每次打开文件清空之前内容
	file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	defer file.Close()
	if err != nil {
		return
	}

	// 直接写入字符串,返回写入字节的数量和err
	n, _ := file.WriteString("写入一行字符串\n")
	fmt.Println(n)

	// 写入byte切片的数据
	strByte := []byte("写入一行byte数据")
	n1, _ := file.Write(strByte)
	fmt.Println(n1)
}

bufio写入文件
import (
	"bufio"
	"os"
)

func main() {

	// 在./路径下创建test.txt文件、写入、每次打开文件清空之前内容
	file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	defer file.Close()
	if err != nil {
		return
	}

	// 创建writer对象
	writer := bufio.NewWriter(file)
	// 将数据写入缓存
	writer.WriteString("写入一行数据")
	// 将缓存的数据写入文件
	writer.Flush()

}

通过ioutil写入文件
// Go 1.16 开始会废弃 io/ioutil 包
import "io/ioutil"

func main() {
	str := "123123123"
	ioutil.WriteFile("./test.txt", []byte(str), 0666)
}

os.WriteFile写入文件

io/ioutil 包写入文件的代替方案

func main() {

	os.WriteFile("./test.txt", []byte("写入写入"), 0666)
}

文件复制

func main() {
	// 读取文件内容
	byteStr, e := os.ReadFile("./test.txt")
	if e != nil {
		return
	}

	// 读取到的内容写入到指定路径
	e1 := os.WriteFile("./calc/test.txt", byteStr, 0666)
	fmt.Println(e1)

}

/*
本质上就是读取文件内容写入一个新文件,也可以用其他方式循环读取文件流,追加循环写入新文件

*/

创建文件目录

func main() {
	// 创建单级目录,返回一个err
	os.Mkdir("./python", 0666)

	// 创建多级目录,返回一个err,mac 0666会提示权限不足
	os.MkdirAll("./Java/demo/01", 0766)

}

删除文件和目录

func main() {
	// 删除文件
	os.Remove("./test.txt")
	// 删除目录,只能删除最底层的嵌套目录,不能删除上级目录
	os.Remove("./Java/demo/01")

	// 删除包含Java在内的以及Java层级下的所有文件和目录
	os.RemoveAll("./Java")

}

文件重命名


import "os"

func main() {
	
	os.Rename("./test.txt", "te.txt")

}

标签:文件,读取,err,fmt,golang,file,os,目录
From: https://www.cnblogs.com/Mickey-7/p/18033107

相关文章

  • golang反射
    反射有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射反射是指在程序运行期间对程序本身进行访问和修改的能力。正常情况程序在编译时,变量被转换......
  • 读取一个图片文件,显示在一个窗口(opencv生成的)
    //下面3行增加在CPP头部#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui_c.h>usingnamespacecv;//下面的代码添加在功能需要的地方,这个窗口和windows程序的窗口不一样,只是一个简单的将图片显示在一个独立的窗口。//菜单、按钮响应功能都可以......
  • opencv android studio build.gradle修改为build.gradle.kts 文件示例
    注意将openCVersionName,openCVersionCode,compileSdk,minSdk进行相应的修改即可.plugins{id("com.android.library")id("org.jetbrains.kotlin.android")}valopenCVersionName="4.9.0"valopenCVersionCode=((4*100+9)*1......
  • 如何把电脑文件传到虚拟机
    如何把电脑文件传到虚拟机方法一:VMWareTools安装VMWaretools,点击上方虚拟机->安装VMwaretools安装成功后,即可通过复制粘贴文件,将文件复制到虚拟机中安装成功后,会显示如下内容安装成功后,可以直接拖动文件,或者通过ctrl+Cctrl+V复制粘贴。若发现不能直接拖动,可以在拖......
  • C++文件读取末尾空行问题
    起因是做gitlet读取文件内容时遇到的内容不匹配错误,后来发现是自己读取文件内容时均使用getline函数,写回时读入的每个字符串都加上换行符,导致文件末尾可能多出换行符。于是改成了vector<string>Blob::readContentsForBlob(conststring&file){vector<string>content;......
  • 《程序是怎样跑起来的》读后感——第八章 从源文件到可执行文件
    在读了本章后我受益颇深。因为CPU能,直接解析并运行的不是源代码,而是本地代码,所以计算机只能够直接运行本地代码。由书可知,用某种编程语言编写的程序称为源代码,保存源代码的文件称为源文件,用C语言编写的源文件的拓展名通常是“.c”。Windows中EXE文件的程序内容,使用的就是本地代码......
  • linux 中输出指定目录下所有一级目录的大小以及磁盘占用最大的目录
     001、[root@pc1test1]#ls##测试文件及目录dir1dir2dir3dir4file1file2[root@pc1test1]#du-ch##显示所有文件及目录的大小220M./dir1530M./dir26.6M./dir3/dir001207M......
  • 通达信【竞价强弱排序】竞价绝杀用于全A股 主做一进二模式 竞价直接结束战斗 短期内的
    {股票指标} 弄明白竞价是怎么回事,避免小白入坑,竞价不适合每一个人,不喜者请绕道竞价公式函数不能回测,请注意,不喜者请绕道集合竞价抓涨停的公式,每天的胜率都不一样哦,但是朋友们要注意第二天是不是能不能冲高走也是一个非常重要的参考因素,而不是当天涨停了就好了 第一点,竞......
  • PNG格式PNG(Portable Network Graphics)位图图形文件格式 无损压缩的图片格式,支持索引
    PNG(PortableNetworkGraphics)是一种位图图形文件格式,它是一种无损压缩的图片格式,支持索引、灰度、RGB和RGBA等多种颜色模式。PNG格式支持多种颜色模式,包括以下几种:索引色模式(IndexedColor):索引色模式使用一个颜色索引表来存储图像中使用的颜色。每个像素使用索引值来指定......
  • 【办公自动化】批量将Markdown文件转换为纯文本文件
    本文介绍如何将Markdown文件转换为纯文本文件。Markdown是一种轻量级的标记语言,用于编写格式简单的文档。但是,有时候我们需要将Markdown文件转换为纯文本文件,以便进行其他处理或直接在浏览器中查看。下面介绍一种简单的方法来实现这个功能。转成html要将Markdown文件转换为......