## 文件操作
os 包提供了不依賴平臺的操作系統函數接口。
### 創建目錄
os.Mkdir("./test",0777) //創建一個新的文件夾,文件夾存在則報錯
os.MkdirAll("./test/test",0777)//創建新文件夾,文件夾存在則不做任何處理,除非linux權限(mkdir dirName: permission denied) 0777前面的0原來是叫個suid和guid的東西。liunx 會繼承父級權限。
### 遍歷目錄
dirs, err := ioutil.ReadDir(dirName) //獲取指定文件夾下的文件與文件夾的名字
err := filepath.Walk() //遞歸方式遍歷
### 創建文件
os.create(file_name)//創建文件,如果文件已經存在則刪除,重新創建新的文件
### 打開文件
os.Open(file_name) //打開文件,只讀權限(O_RDONLY),文件不存在報錯
os.OpenFile("10.txt",os.O_RDWR|os.O_APPEND|os.O_CREATE,0)//可自定義設置文件打開模式
O_RDONLY:只讀模式(read-only)
O_WRONLY:只寫模式(write-only)
O_RDWR:讀寫模式(read-write)
O_APPEND:追加模式(append)
O_CREATE:文件不存在就創建(create a new file if none exists.)
O_EXCL:與 O_CREATE 一起用,構成一個新建文件的功能,它要求文件必須不存在(used with O_CREATE, file must not exist)
O_SYNC:同步方式打開,即不使用緩存,直接寫入硬盤
O_TRUNC:打開并清空文件
### 關閉資源句柄
defer f.Close()//關閉文件,defer 延遲函數的運行
### 讀取文件
//需要引入新的一個包 import bufio
scanner := bufio.NewScanner(f) //創建一個 Scanner 來掃描 r,默認匹配函數為 ScanLines。
for scanner.Scan(){ //檢測是否讀取到末尾EOF返回真假
fmt.Println(scanner.Text()) //已文本形式輸出每行內容
}
### 寫入文件
offset:開始的偏移量,也就是代表需要移動偏移的字節數
whence:給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2
file1.WriteString("lsadasdasdas1231321"))
file1.Write([]byte("lsadasdasdas1231321\r\n"))
### 文件刪除
os.Remove(name) //刪除制定文件和目錄,注意刪除目錄時只能刪除空目錄。
os.RemoveAll(name)//刪除制定文件和目錄。如果刪除文件不存在不會拋出異常返回nil,刪除成功也會返回nil
### 判斷文件或文件夾是否存在
os.Stat(path) //如果返回的錯誤為nil,說明文件或文件夾存在
os.IsNotExist(path) //判斷為true,說明文件或文件夾不存在
如果返回的錯誤為其它類型,則不確定是否在存在
### 文件copy
io.Copyt("復制后的文件句柄","復制前的文件句柄") //把一個文件的內容copy的內一個文件當中。
### 導出內容到Excel
import "encoding/csv"
f.WriteString("\xEF\xBB\xBF") //寫入UTF-8 BOM,此處如果不寫入就會導致寫入的漢字亂碼
w := csv.NewWriter(f)
w.Write()//寫入第一行默認為表頭
w.WriteAll()//寫入多行
w.Flush()
~~~
//Mick版本
package main
import (
"os"
"fmt"
"bufio"
"io/ioutil"
"io"
"path/filepath"
)
//文件夾創建
func dirCreate(dirName string,mode int) {
var err error
switch mode {
case 1:
err = os.Mkdir(dirName,0777) //創建一個新的文件夾,文件夾存在則報錯
case 2:
err = os.MkdirAll(dirName,0777) //創建新文件夾,文件夾存在則不做任何處理,除非linux權限(mkdir dirName: permission denied)
}
fmt.Println(err)
}
//文件夾遍歷,獲取指定文件夾下的文件與文件夾的名字
func eachDir(dirName string){
dirs, err := ioutil.ReadDir(dirName)
if err != nil {
fmt.Println(err)
}
for _,v := range dirs{
fmt.Println(v.Name())
}
}
//文件遞歸遍歷
func getFileList(path string) {
err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
if f.IsDir() {
return nil
}
fmt.Println(path)
return nil
})
if err != nil {
fmt.Println("filepath.Walk()")
}
}
//文件創建
func fileCreate(fileName string){
fileHandle,err := os.Create(fileName) //創建文件,如果文件已經存在則刪除,重新創建新的文件
fmt.Println(fileHandle,err)
}
//文件讀取
func readFile(fileName string,mode int){
//fileHandle,err := os.Open(fileName) //打開文件,只讀權限(O_RDONLY),文件不存在報錯
fileHandle,err := os.OpenFile(fileName,os.O_RDWR|os.O_CREATE,0) //可自定義設置文件打開模式
defer fileHandle.Close() //函數返回前執行文件資源關閉操作(好習慣)
if err != nil{
panic(err)
}
if mode == 1{
//方案1 直接按行讀取
scanner := bufio.NewScanner(fileHandle) //Scanner結構體用于按行讀取
for scanner.Scan(){ //檢測是否讀取到末尾EOF返回真假
fmt.Println(scanner.Text()) //返回字符串
}
}else if mode ==2{
//方案2 按照指定定界符讀取
reader := bufio.NewReader(fileHandle)
for{
line, err := reader.ReadString('\n')
if err != nil || err == io.EOF{
break
}
fmt.Println(line,err)
}
}else if mode == 3{
//方案3 一次性讀取完
data,err := ioutil.ReadAll(fileHandle) //
fmt.Println(string(data),err)
}
}
//文件寫入
func writeFile(fileName string,content string){
fileHandle,err := os.OpenFile(fileName,os.O_RDWR|os.O_APPEND,0) //追加讀寫方式
if err != nil{
panic(err)
}
//num,err := fileHandle.WriteString(content) //字符串寫入,返回寫入的字節數量
num,err := fileHandle.Write([]byte(content)) //字節寫入,返回寫入的字節數量
fmt.Println(num,err)
}
//文件刪除
func removeFile(fileName string){
err := os.Remove(fileName)
fmt.Println(err)
}
//檢測文件夾文件夾是否存在
func FDExists(name string) {
_,err := os.Stat(name) // 獲取文件的基本信息
if os.IsNotExist(err){ //判斷文件不存在
fmt.Println(false)
}else{
fmt.Println(true)
}
}
func main() {
//dirCreate("mick/a/a",2) //文件夾創建操作
//eachDir("mick") //遍歷文件夾
getFileList("mick") //遞歸遍歷文件
//fileCreate("mick/a.txt") //文件創建
//readFile("mick/a.txt",3) //文件讀取
//writeFile("mick/a.txt","a\n") //字符串的形式寫入文件
//removeFile("mick/a.txt") //文件刪除
//FDExists("mick/a.txtq")
}
//FUZZ版本
package main
import (
"fmt"
"os"
"bufio"
)
//文件操作
func main() {
//創建文件目錄
err := os.Mkdir("./demo",0777) //前面的0原來是叫個suid和guid的東西. r 4 w 2 x 1 s 4 g 2 u 1 所屬人 所屬組 linux 權限繼承上級目錄
fmt.Println(err)
err = os.MkdirAll("./demo1/demo1/demo2",0777)
fmt.Println(err)
file,_ := os.Create("a.txt") //已存在后,會覆蓋源文件
fmt.Println(file.Name())
f,e := os.Open("a.txt")
/*
O_RDONLY:只讀模式(read-only)
O_WRONLY:只寫模式(write-only)
O_RDWR:讀寫模式(read-write)
O_APPEND:追加模式(append)
O_CREATE:文件不存在就創建(create a new file if none exists.)
O_EXCL:與 O_CREATE 一起用,構成一個新建文件的功能,它要求文件必須不存在(used with O_CREATE, file must not exist)
O_SYNC:同步方式打開,即不使用緩存,直接寫入硬盤
O_TRUNC:打開并清空文件
*/
f,e = os.OpenFile("b.txt",os.O_RDWR|os.O_CREATE|os.O_APPEND,0777)
if e != nil{
fmt.Println(e)
}
fmt.Println(f,e)
defer f.Close() //關閉文件
s := bufio.NewScanner(f)
///*offset:開始的偏移量,也就是代表需要移動偏移的字節數
//whence:給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2文件結尾開始*/
for s.Scan(){
fmt.Println(s.Text()) //輸出每行內容
}
a := []byte("你好世界\n換行")
f.Write(a)
weizhi,_ := f.Seek(0,0)
b := make([]byte,1024)
du,xie := f.Read(b)
fmt.Println(weizhi,du,xie,string(b))
e = os.RemoveAll("./demo")// 空文件加
e = os.Remove("./demo11")
fmt.Println(e)
path := "E:\\GOPATH\\src\\test\\a.txt"
_,e = os.Stat(path)
fmt.Println(os.IsNotExist(e))
}
~~~