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
}