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())
}
创建目录和文件
// 创建目录
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)
}
读取文件内容
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()
}
向文件中写入数据
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)
}
手动实现文件复制
//文件复制
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)
}
}
}
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("打阿伟玩云桑")
}
实现断点续传
// 断点续传
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))
}
}
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()
}
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)
}
}
}