• Go语言中的IO


    Fileinfo获取文件信息、

    func main() {
    	//0s
    	fileinfo, err := os.Stat("./a.txt")
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(fileinfo.Name())
    	fmt.Println(fileinfo.IsDir())   //是否是目录
    	fmt.Println(fileinfo.Size())    //文件大小
    	fmt.Println(fileinfo.Mode())    //文件的权限
    	fmt.Println(fileinfo.ModTime()) //文件的修改时间
    	//反射,获取文件更加详细的信息
    	fmt.Println(fileinfo.Sys())
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    创建目录和文件

    // 创建目录
    func main() {
    	//mkdir 创建目录
    	err := os.Mkdir("./zhou", os.ModePerm)
    	if err != nil {
    		fmt.Println(err)
    		//return 有一个中断运行的作用
    	}
    	err1 := os.MkdirAll("./nan/a/wei", os.ModePerm)
    	if err1 != nil {
    		fmt.Println(err1)
    		//return 有一个中断运行的作用
    		//return
    	}
    	fmt.Println("文件夹创建完毕")
    	err3 := os.Remove("./nan/a/wei")
    	if err3 != nil {
    		fmt.Println(err3)
    		//return
    	}
    
    }
    
    
    // 创建文件
    func main() {
    
    	file, err := os.Create("./b.txt")
    	fmt.Println(err)
    	fmt.Println(file)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    读取文件内容

    func main() {
    	//打开文件
    	file, err := os.Open("./a.txt")
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(file.Name())
    	//关闭连接
    	defer file.Close()
    	//读取文件的内容
    	//Read到容器,返回读取数量n
    	//如果读到了文件的末尾 err=io.EOF
    	bs := make([]byte, 4, 1024)
    	n, err := file.Read(bs)
    	fmt.Println(n)
    	fmt.Println(string(bs))
    	fmt.Println(err)
    
    	//openfile 文件路径 打开方式 文件的权限
    	//file2, err := os.OpenFile("./a.txt", os.O_RDONLY|os.O_WRONLY, os.ModePerm)
    	//if err != nil {
    	//	fmt.Println(err)
    	//	return
    	//}
    	//fmt.Println(file2.Name())
    	关闭连接
    	//defer file2.Close()
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    向文件中写入数据

    func main() {
    	//os.O_APPEND追加不改变数据
    	file, err := os.OpenFile("./a.txt", os.O_RDONLY|os.O_WRONLY|os.O_APPEND, os.ModePerm)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    
    	defer file.Close()
    	//业务代码
    	bs := []byte{65, 66, 67, 68, 69}
    	n, err := file.Write(bs)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(n)
    	n1, err := file.WriteString("周南打阿伟")
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(n1)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    手动实现文件复制

    
    
    //文件复制
    
    func main() {
    	source := "./zhou/周南大王.jpg"
    	destination := "./打阿伟ss.jpg"
    	//copy(source, destination, 1024)
    	//copy2(source, destination)
    	copy3(source, destination)
    }
    func copy3(source, destination string) {
    	//一次性把文件读到fileBuf中
    	fileBuf, _ := os.ReadFile(source)
    	os.WriteFile(destination, fileBuf, 0777)
    }
    func copy2(source, destination string) {
    	//连接输入文件
    	sourcefile, err := os.Open(source)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer sourcefile.Close()
    	//连接输出文件
    	destinationfile, err := os.OpenFile(destination, os.O_RDONLY|os.O_WRONLY|os.O_CREATE, os.ModePerm)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer destinationfile.Close()
    
    	//io
    	written, _ := io.Copy(destinationfile, sourcefile)
    	fmt.Println("文件大小:", written)
    }
    func copy(source, destination string, bufSize int) {
    	//连接输入文件
    	sourcefile, err := os.Open(source)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer sourcefile.Close()
    	//连接输出文件
    	destinationfile, err := os.OpenFile(destination, os.O_RDONLY|os.O_WRONLY|os.O_CREATE, os.ModePerm)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer destinationfile.Close()
    
    	//缓存区
    	buf := make([]byte, bufSize)
    	for {
    		n, err := sourcefile.Read(buf)
    		if err == io.EOF || n == 0 {
    			fmt.Println("文件复制完毕了")
    			break
    		}
    		_, err = destinationfile.Write(buf[:n])
    		if err != nil {
    			fmt.Println("写出失败", err)
    		}
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    Seek接口

    func main() {
    	file, _ := os.OpenFile("./a.txt", os.O_RDWR, 0777)
    	defer file.Close()
    	//业务
    	file.Seek(2, io.SeekStart)
    	buf := []byte{0}
    	file.Read(buf)
    	fmt.Println(string(buf))
    	file.Seek(2, io.SeekCurrent)
    	file.Read(buf)
    	fmt.Println(string(buf))
    	file.Seek(0, io.SeekEnd)
    	file.WriteString("打阿伟玩云桑")
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    实现断点续传

    // 断点续传
    func main() {
    	srcFile := "./zhou/周南大王.jpg"
    	destFile := "./打阿伟sss.jpg"
    	tempFile := "./c.txt"
    	file1, _ := os.Open(srcFile)
    	file2, _ := os.OpenFile(destFile, os.O_CREATE|os.O_RDWR, 0777)
    	file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, 0777)
    	defer file1.Close()
    	defer file2.Close()
    
    	//读取临时文件记录的数据
    	file3.Seek(0, io.SeekStart)
    	buf := make([]byte, 1024, 1024)
    	n, _ := file3.Read(buf)
    	countStr := string(buf[0:n])
    	fmt.Println("countStr", countStr)
    	count, _ := strconv.ParseInt(countStr, 10, 64)
    	file1.Seek(count, io.SeekStart)
    	file2.Seek(count, io.SeekStart)
    	bufData := make([]byte, 1024, 1024)
    	total := int(count)
    	for {
    		readNum, err := file1.Read(bufData)
    		if err == io.EOF {
    			fmt.Println("文件读取完毕")
    			file3.Close()
    			os.Remove(tempFile)
    			break
    		}
    		writeNum, err := file2.Write(bufData[:readNum])
    		total = total + writeNum
    		//将传输进度更新到临时文件
    		file3.Seek(0, io.SeekStart)
    		file3.WriteString(strconv.Itoa(total))
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    bufio包

    file, _ := os.OpenFile("./a.txt", os.O_RDWR, 0777)
    	defer file.Close()
    
    	//bufio 包装
    	reader := bufio.NewReader(file)
    	buf := make([]byte, 1024)
    	n, _ := reader.Read(buf)
    	fmt.Println(n)
    	fmt.Println(string(buf[:n]))
    
    	//读取键盘的输入
    	inputReader := bufio.NewReader(os.Stdin)
    	str, _ := inputReader.ReadString('\n')
    	fmt.Println("键盘的输入为", str)
    
    	//发现并没有输出文件,是留在了缓冲区,所以我们需要调用flush刷新缓冲区
    	//将缓冲区的数据,写入文件
    	writer := bufio.NewWriter(file)
    	writerNum, _ := writer.WriteString("玩云桑打阿伟")
    	fmt.Println(writerNum)
    	writer.Flush()
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    How to 遍历文件夹

    
    func main() {
    
    	listDir("./", 0)
    
    }
    
    // 用于 读取目录遍历文件如果是文件打印文件名字,如果是目录继续遍历目录下的东西即可
    func listDir(filepath string, tabint int) {
    	tab := "|--"
    	for i := 0; i < tabint; i++ {
    		tab = "|    " + tab
    	}
    	dir := filepath
    	fileinfos, _ := os.ReadDir(dir)
    	for _, file := range fileinfos {
    		fileName := dir + file.Name()
    		fmt.Printf("%s%s\n", tab, fileName)
    
    		if file.IsDir() {
    			listDir(fileName, tabint+1)
    
    		}
    
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Dubbo---使用直连方式 dubbo
    java your MySQL server version for the right syntax to use near
    微信小程序使用npm教程
    【python】list 删除列表中某个元素的3种方法;附加删除numpy数组中的指定索引元素的方法
    [运维|中间件] 东方通TongWeb忘记密码后修改密码
    Linux 线程池&单例模式&读写锁&自旋锁
    从基础知识到应用实例,一站式掌握 Python 正则表达式
    博客摘录「 MPLS/LDP原理介绍+报文分析+配置示例」2023年9月26日
    vue3+node.js+mysql+ant design实现表格的查询功能
    python入门教程基础篇:数据类型
  • 原文地址:https://blog.csdn.net/ZN175623/article/details/127699980