文件操作
package main
import (
"fmt"
"os"
)
func main() {
/*
FileInfo:文件信息
interface
Name():文件名
Size():文件大小,單位字節(jié)
IsDir():是否為目錄
ModTime():修改時(shí)間
Mode():權(quán)限
*/
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
//修改時(shí)間
fmt.Println(fileinfo.ModTime()) //2020-03-17 11:55:30.703993888 +0800 CST
//權(quán)限
fmt.Println(fileinfo.Mode()) //-rw-r--r--
}
package main
import (
"fmt"
"os"
"path"
"path/filepath"
)
//4
func main() {
/*
文件操作:
1.路徑:
相對(duì)路徑:relative
相對(duì)于當(dāng)前工程:abc.txt
絕對(duì)路徑:absolute
/Users/isuntong/Documents/test/a/abc.txt
.當(dāng)前目錄
..上一層
*/
//1辑莫。路徑
fileName1 := "/Users/isuntong/Documents/test/a/abc.txt"
fileName2 := "ab.txt"
//是否是絕對(duì)路徑
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. 創(chuàng)建目錄 os.ModePerm權(quán)限
err := os.Mkdir("/Users/isuntong/Documents/test/a/bb",os.ModePerm)
if err != nil {
fmt.Println("err:",err)
// return
}
fmt.Println("文件夾創(chuàng)建成功")
err2 := os.MkdirAll("/Users/isuntong/Documents/test/a/cc/dd/ee",os.ModePerm)
if err2 != nil {
fmt.Println("err:",err2)
// return
}
fmt.Println("多層文件夾創(chuàng)建成功")
//3枝笨。 創(chuàng)建文件 不存在創(chuàng)建剔桨,存在使其變?yōu)榭? file1,err3 := os.Create("/Users/isuntong/Documents/test/a/ab.txt")
if err3 != nil {
fmt.Println("err:",err3)
// return
}
fmt.Println(file1) //&{0xc0000b2120}
//4。 打開文件 讓當(dāng)前程序和指定文件之間簡歷連接
//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. 關(guān)閉文件
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/") //刪除目錄脚猾,謹(jǐn)慎使用
}
io讀操作
package main
import (
"fmt"
"io"
"os"
)
//5
func main() {
/*
讀取數(shù)據(jù):
Reader借口:
Read(p [[byte)(n int,error)
讀取本地abc.txt文件中的數(shù)據(jù)砰奕、
*/
//1军援。 打開文件
fileName := "/Users/isuntong/Documents/test/a/abc.txt"
file,err := os.Open(fileName)
if err != nil {
fmt.Println("err:",err)
return
}
//3胸哥。 關(guān)閉文件
defer file.Close()
//2空厌。 讀取數(shù)據(jù) 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
讀取到文件末尾,結(jié)束讀取操作
*/
n := -1
for {
n,err = file.Read(bs)
if n==0 || err == io.EOF{
fmt.Println("讀取到文件末尾赋朦,結(jié)束讀取操作")
break
}
fmt.Println(string(bs[:n]))
}
}
io寫操作
package main
import (
"fmt"
"log"
"os"
)
//6
func main() {
/*
寫出數(shù)據(jù):
讀取本地abc.txt文件中的數(shù)據(jù)宠哄、
*/
fileName := "/Users/isuntong/Documents/test/a/ab.txt"
//1. 打開文件
//file,err := os.Open(fileName) 沒有權(quán)限毛嫉,只有只讀承粤,寫的時(shí)候報(bào)錯(cuò) 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. 關(guān)閉文件
defer file.Close()
//2. 寫出數(shù)據(jù) 每次從頭開始寫浪讳,即覆蓋之前的n個(gè)
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)
}
}
復(fù)制文件
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
)
//7
func main() {
/*
拷貝文件:
讀取本地abc.txt文件中的數(shù)據(jù)、拷貝圖片什么的也可以
*/
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操作實(shí)現(xiàn)文件的拷貝辐真,返回值是拷貝的總數(shù)量(字節(jié))侍咱,錯(cuò)誤
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("出錯(cuò)了楔脯。昧廷。偎箫。")
return total,err
}
total += n
file2.Write(bs[:n])
}
return total,nil
}
斷點(diǎn)續(xù)傳
bufio包
func NewReader(rd io.Reader) *Reader
func NewReaderSize(rd io.Reader,size int) *Reader