## 文件操作
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))
}
~~~