🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1. # 文件操作 * * * * * --: 作者:Fuzz 时间:2018年8月15日 * * * * * 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决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。 whence在系统中定义的有常量: SEEK\_SET:0 SEEK\_CUR:1 SEEK\_END:2 Seek(offset,whence) 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)) } ~~~