文件 io
2020-03-17 本文已影响0人
isuntong
文件操作
package main
import (
"fmt"
"os"
)
func main() {
/*
FileInfo:文件信息
interface
Name():文件名
Size():文件大小,单位字节
IsDir():是否为目录
ModTime():修改时间
Mode():权限
*/
fileinfo,err := os.Stat("/Users/isuntong/Documents/test/a/abc.txt")
if err != nil {
fmt.Println("err:",err)
return
}
fmt.Printf("%T\n",fileinfo) // *os.fileStat
//文件名
fmt.Println(fileinfo.Name()) //abc.txt
//大小
fmt.Println(fileinfo.Size()) //12
//是不是目录
fmt.Println(fileinfo.IsDir()) //false
//修改时间
fmt.Println(fileinfo.ModTime()) //2020-03-17 11:55:30.703993888 +0800 CST
//权限
fmt.Println(fileinfo.Mode()) //-rw-r--r--
}
package main
import (
"fmt"
"os"
"path"
"path/filepath"
)
//4
func main() {
/*
文件操作:
1.路径:
相对路径:relative
相对于当前工程:abc.txt
绝对路径:absolute
/Users/isuntong/Documents/test/a/abc.txt
.当前目录
..上一层
*/
//1。路径
fileName1 := "/Users/isuntong/Documents/test/a/abc.txt"
fileName2 := "ab.txt"
//是否是绝对路径
fmt.Println(filepath.IsAbs(fileName1)) //true
fmt.Println(filepath.IsAbs(fileName2)) //false
fmt.Println(filepath.Abs(fileName1)) ///Users/isuntong/Documents/test/a/abc.txt <nil>
fmt.Println(filepath.Abs(fileName2)) ///Users/isuntong/go/src/demo/ab.txt <nil>
fmt.Println("获取父目录:",path.Join(fileName1,"..")) //获取父目录: /Users/isuntong/Documents/test/a
//2. 创建目录 os.ModePerm权限
err := os.Mkdir("/Users/isuntong/Documents/test/a/bb",os.ModePerm)
if err != nil {
fmt.Println("err:",err)
// return
}
fmt.Println("文件夹创建成功")
err2 := os.MkdirAll("/Users/isuntong/Documents/test/a/cc/dd/ee",os.ModePerm)
if err2 != nil {
fmt.Println("err:",err2)
// return
}
fmt.Println("多层文件夹创建成功")
//3。 创建文件 不存在创建,存在使其变为空
file1,err3 := os.Create("/Users/isuntong/Documents/test/a/ab.txt")
if err3 != nil {
fmt.Println("err:",err3)
// return
}
fmt.Println(file1) //&{0xc0000b2120}
//4。 打开文件 让当前程序和指定文件之间简历连接
//os.open(filename)
//os.openFile(filename,mode,perm)
file3,err := os.Open(fileName1)
fmt.Println(file3) //&{0xc000132180}
file4,err := os.OpenFile(fileName1,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
fmt.Println(file4)
//5. 关闭文件
file4.Close()
//6. 删除文件或者文件夹
// err := os.Remove("/Users/isuntong/Documents/test/a/ab.txt")
// err := os.Remove("/Users/isuntong/Documents/test/a/") //删除目录,如果不为空不能删除
// err := os.RemoveAll("/Users/isuntong/Documents/test/a/") //删除目录,谨慎使用
}
io读操作
package main
import (
"fmt"
"io"
"os"
)
//5
func main() {
/*
读取数据:
Reader借口:
Read(p [[byte)(n int,error)
读取本地abc.txt文件中的数据、
*/
//1。 打开文件
fileName := "/Users/isuntong/Documents/test/a/abc.txt"
file,err := os.Open(fileName)
if err != nil {
fmt.Println("err:",err)
return
}
//3。 关闭文件
defer file.Close()
//2。 读取数据 abcdefghij
bs := make([]byte,4,4)
/*
//第一次读取
n,err := file.Read(bs)
fmt.Println(err) //<nil>
fmt.Println(n) //4
fmt.Println(bs) //[97 98 99 100]
fmt.Println(string(bs)) //abcd
//第二次读取
n,err = file.Read(bs)
fmt.Println(err) //<nil>
fmt.Println(n) //4
fmt.Println(bs) //[101 102 103 104]
fmt.Println(string(bs)) //efgh
//第三次读取
n,err = file.Read(bs)
fmt.Println(err) //<nil>
fmt.Println(n) //2
fmt.Println(bs) //[105 106 103 104]
fmt.Println(string(bs)) //ijgh
//第四次读取
n,err = file.Read(bs)
fmt.Println(err) //EOF
fmt.Println(n) //0
fmt.Println(bs) //[105 106 103 104]
fmt.Println(string(bs)) //ijgh
*/
/*
abcd
efgh
ij
读取到文件末尾,结束读取操作
*/
n := -1
for {
n,err = file.Read(bs)
if n==0 || err == io.EOF{
fmt.Println("读取到文件末尾,结束读取操作")
break
}
fmt.Println(string(bs[:n]))
}
}
io写操作
package main
import (
"fmt"
"log"
"os"
)
//6
func main() {
/*
写出数据:
读取本地abc.txt文件中的数据、
*/
fileName := "/Users/isuntong/Documents/test/a/ab.txt"
//1. 打开文件
//file,err := os.Open(fileName) 没有权限,只有只读,写的时候报错 bad file descriptor
//O_APPEND 这样就是追加,不是覆盖
file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,os.ModePerm)
if err != nil {
fmt.Println("err",err)
return
}
//3. 关闭文件
defer file.Close()
//2. 写出数据 每次从头开始写,即覆盖之前的n个
bs := []byte{65,66,67,68,69,70} //ABCDEF
//n,err := file.Write(bs)
n,err := file.Write(bs[:2])
fmt.Println(n) //2
HandleErr(err)
//直接写出字符串
n,err = file.WriteString("helloworld")
fmt.Println(n) //10
HandleErr(err)
//换行
file.WriteString("\n")
n,err = file.Write([]byte("today"))
}
func HandleErr(err error) {
if err != nil {
log.Fatal(err)
}
}
复制文件
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
)
//7
func main() {
/*
拷贝文件:
读取本地abc.txt文件中的数据、拷贝图片什么的也可以
*/
srcFile := "/Users/isuntong/Documents/test/a/ab.txt"
destFile := "ab.txt"
total,err := CopyFile1(srcFile,destFile) //拷贝完毕
fmt.Println(total,err) //38 <nil>
}
//利用ioutil
func CopyFile3(srcFile,destFile string) (int,error) {
bs,err := ioutil.ReadFile(srcFile)
if err != nil {
return 0,err
}
err = ioutil.WriteFile(destFile,bs,0777)
if err != nil {
return 0,err
}
return len(bs),nil
}
//使用io.Copy()方法 这种方法比较好
func CopyFile2(srcFile,destFile string) (int64,error) {
file1,err := os.Open(srcFile)
if err != nil {
return 0,err
}
file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
if err != nil {
return 0,err
}
defer file1.Close()
defer file2.Close()
return io.Copy(file2,file1)
}
//用于通过io操作实现文件的拷贝,返回值是拷贝的总数量(字节),错误
func CopyFile1(srcFile,destFile string) (int,error) {
file1,err := os.Open(srcFile)
if err != nil {
return 0,err
}
file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
if err != nil {
return 0,err
}
defer file1.Close()
defer file2.Close()
//读写
bs := make([]byte,1024,1024)
n := -1
total := 0
for {
n,err = file1.Read(bs)
if err == io.EOF || n == 0 {
fmt.Println("拷贝完毕")
break
} else if err != nil {
fmt.Println("出错了。。。")
return total,err
}
total += n
file2.Write(bs[:n])
}
return total,nil
}
断点续传
bufio包
func NewReader(rd io.Reader) *Reader
func NewReaderSize(rd io.Reader,size int) *Reader