Go之IO操作

1. File文件操作

package main

import (
	"fmt"
	"os"
	"path"
	"path/filepath"
)

func main() {
	/*
	   FileInfo:文件信息
	       interface
	           Name(),文件名
	           Size(),文件大小,字节为单位
	           IsDir(),是否是目录
	           ModTime(),修改时间
	           Mode(),权限

	*/
	fileInfo, err := os.Stat(`D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("显示文件类型:%T\n", fileInfo)
	fmt.Println("文件名:", fileInfo.Name())
	fmt.Println("文件大小:", fileInfo.Size())
	fmt.Println("是否是目录:", fileInfo.IsDir())
	fmt.Println("文件修改时间按:", fileInfo.ModTime())
	fmt.Println("文件权限:", fileInfo.Mode())
	/*
	   os:文件操作
			1.路径:
	        相对路径:relative
	            ab.txt
	            相对于当前工程
	        绝对路径:absolute
	            /Users/ruby/Documents/pro/a/aa.txt

	        .当前目录
	        ..上一层
	    2.创建文件夹,如果文件夹存在,创建失败
	        os.MkDir(),创建一层
	        os.MkDirAll(),可以创建多层
	    3.创建文件,Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
	        os.Create(),创建文件
	    4.打开文件:让当前的程序,和指定的文件之间建立一个连接
	        os.Open(filename)
	        os.OpenFile(filename,mode,perm)
	    5.关闭文件:程序和文件之间的链接断开。
	        file.Close()
	    5.删除文件或目录:慎用,慎用,再慎用
	        os.Remove(),删除文件和空目录
	        os.RemoveAll(),删除所有
	*/
	fileName1 := `D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`
	fmt.Println("是否是绝对路径:", filepath.IsAbs(fileName1))
	fmt.Println("是否是绝对路径:", filepath.IsAbs(`src/cn/itcast/Go/other/text/IO`))
	fmt.Println("获取上一级目录:", path.Join(fileName1, "."))
	err = os.Mkdir(`src/cn/itcast/Go/other/text/txt`, os.ModePerm)
	if err != nil{
		fmt.Println(err)
		return
	}else {
		fmt.Println("文件夹创建成功")
	}
	file, err := os.Open(`D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`)
	if err != nil{
		fmt.Println(err)
		return
	}else {
		fmt.Println(file)
	}
}

运行结果:

显示文件类型:*os.fileStat
文件名: IO
文件大小: 213
是否是目录: false
文件修改时间按: 2022-03-07 10:15:54.1110587 +0800 CST
文件权限: -rw-rw-rw-
是否是绝对路径: true
是否是绝对路径: false
获取上一级目录: D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO
文件夹创建成功
&{0xc000048000}

2. 读写操作

package utils

import (
	"bufio"
	"fmt"
	"io"
	"os"
)
// 通过IO包中的read()和write()来读取数据
func IoRead() {
	/*
	   读取数据:
	       Reader接口:
	           Read(p []byte)(n int, error)
	*/
	bs := make([]byte, 4, 4)
	byteRead := make([]byte, 4, 4)
	filename := `D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`
	file, err := os.Open(filename)
	if err != nil {
		fmt.Println(err)
		return
	}
	read, err := file.Read(bs)
	fmt.Println("返回的错误", err)
	fmt.Println("获取的字节数:", read)
	fmt.Println("一次性获取的内容:", string(bs))
	n := -1
	for {
		n, err = file.Read(byteRead)
		if n == 0 || err == io.EOF {
			fmt.Println("文件读取完毕!")
			return
		}
		fmt.Printf(string(byteRead[:n]))
	}
}
func IoWrite() {
	/*
		   向本地文件中写入数据:
		        Write接口:
		           Write(b []byte) (n int, err error)
				第一步:打开文件
				第二步:写出数据
				第三步:关闭文件
	*/

	filename := `D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`
	file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	// 写入字符串
	writeString, _ := file.WriteString("向本地文件中写入数据")
	fmt.Println("写入文件的字节数:", writeString)
	file.WriteString("\n")
	// 写入字节
	bs := []byte{'W', 'r', 'i', 't', 'e'}
	n, _ := file.Write(bs)
	fmt.Println(n)
}
// 通过bufio包使用NewReader()和NewWriter()来提高效率,buffer
func BufioRead(){
	srcFile := `D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`
	file, err := os.Open(srcFile)
	if err != nil{
		fmt.Println(err)
		return
	}
	defer file.Close()
	/*
	   bufio:高效io读写
	       buffer缓存
	       io:input/output

	   将io包下的Reader,Write对象进行包装,带缓存的包装,提高读写的效率

	       ReadBytes()
	       ReadString()
	       ReadLine()

	*/
	reader := bufio.NewReader(os.Stdin)
	readString, _ := reader.ReadString('\n')
	fmt.Println(readString)
}
func BufioWrite(){
	srcFile := `D:\softwares\Idea\ConstantDemo\src\cn\itcast\Go\other\text\IO`
	file, err := os.Open(srcFile)
	if err != nil{
		fmt.Println(err)
		return
	}
	defer file.Close()

	reader := bufio.NewWriter(file)
	reader.WriteString("")
	reader.Flush()
}

3. 文件复制

package utils

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

// 文件复制方法一:io包下的Read()和Write()方法实现
func Copy1(src, dest string) (int, error) {
	open, err := os.Open(src)
	if err != nil {
		return 0, err
	}
	defer open.Close()
	file, err := os.OpenFile(dest, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
	if err != nil {
		return 0, err
	}
	defer file.Close()

	bytes := make([]byte, 1024, 1024)
	n := -1
	total := 0
	for {
		n, err = open.Read(bytes)
		if err == io.EOF || n == 0 {
			fmt.Println("拷贝完毕")
			break
		} else if err != nil {
			fmt.Println("报错了。。。")
			return total, err
		}
		total += n
		file.Write(bytes)
	}
	return total, nil
}

// 文件复制方法二:io包下的Copy()方法实现(推荐),还有N(),Buffer()
func Copy2(src, dest string) (int64, error) {
	open, err := os.Open(src)
	if err != nil {
		return 0, err
	}
	defer open.Close()
	file, err := os.OpenFile(dest, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
	if err != nil {
		return 0, err
	}
	defer file.Close()

	return io.Copy(file,open)
}
// 文件复制方法三:ioutil包中的 ioutil.WriteFile()和 ioutil.ReadFile(),但由于使用一次性读取文件,再一次性写入文件的方式,所以该方法不适用于大文件,容易内存溢出
func Copy3(srcFile, destFile string)(int,error){
	input, err := ioutil.ReadFile(srcFile)
	if err != nil {
		fmt.Println(err)
		return 0,err
	}

	err = ioutil.WriteFile(destFile, input, 0644)
	if err != nil {
		fmt.Println("操作失败:", destFile)
		fmt.Println(err)
		return 0,err
	}

	return len(input),nil
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值