2019-01-18 Golang学习笔记-文件操作
1.简单读取文件
package main
import (
"bufio"
"fmt"
"io"
"os"
)
/*
简单文件操作练习
*/
func main() {
file, err := os.Open("D:/go/go_code/src/project0040/src/abc.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("the file is: %v\n", file)
defer file.Close()
// 一次性读取文件
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
fmt.Println(str)
if err == io.EOF{
break
}
}
}
2.一次性读取较小文件
package main
import (
"fmt"
"io/ioutil"
)
/*
简单文件操作练习
*/
func main() {
// 一次性将文件读成 []byte类型 // 不推荐大文件这样进行读取
fileByteArr, err := ioutil.ReadFile("D:/go/go_code/src/project0040/src/abc.txt")
if err != nil{
fmt.Printf("error! %v\n", err)
}
fmt.Printf("\n%v\n", fileByteArr)
fmt.Println()
fmt.Printf("%v", string(fileByteArr))
}
3.写入文件
1.创建一个文件并写入字符串
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
/*
写入文件
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
*/
file, err := os.OpenFile("D:/go/go_code/src/project0040/src/abc.txt", os.O_APPEND|os.O_CREATE, 0666) //os.O_APPEND标明在文件末尾追加写入 os.O_CREATE如果文件不存在就创建
if err != nil{
fmt.Printf("error! %v", err)
}
defer file.Close()
writer := bufio.NewWriter(file)
var inputStr string
inputStr = "我是小可爱呀\n"
for count := 0; count < 5; count++ {
writer.Write([]byte (inputStr))
}
writer.Flush()
}
4.文件读写综合操作
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
/*
将 e:/abc.txt内容写入到 e:/def.txt文件中
*/
fileStr := "e:/abc.txt"
fileStr2 := "e:/def.txt"
byteArr, err2 := ioutil.ReadFile(fileStr)
if err2 != nil {
fmt.Printf("error: %v", err2)
}
err3 := ioutil.WriteFile(fileStr2, byteArr, os.ModeAppend)
if err3 != nil {
fmt.Printf("error: %v", err2)
}
}
5.判断文件是否存在
func PathExists(path string)(bool, error) {
_, err := os.Stat(path)
if err == nil{
return true,nil
}
if os.IsNotExist(err){
return false, nil
}
return false, err
}
6.拷贝文件操作
func CopyFile(locStr string, dstStr string)(bool, error){
if locStr == "" || dstStr == ""{
return false, nil
}
file, err := os.OpenFile(locStr, os.O_RDONLY, 0666)
if err != nil{
return false, err
}
defer file.Close()
reader := bufio.NewReader(file)
file2, err2 := os.OpenFile(dstStr, os.O_CREATE|os.O_WRONLY, 0666)
if err2 != nil{
return false, err2
}
defer file2.Close()
writer := bufio.NewWriter(file2)
_, err3 := io.Copy(writer, reader)
if err3 != nil{
return false, err3
}
return true, nil
}
7.统计文件练习
package main
import (
"bufio"
"fmt"
"io"
"os"
)
/*
统计文件 英文, 数字, 空格, 其他字符的数量
*/
func main() {
var locStr string = "E:/countFile.txt"
conutResult := countFile(locStr)
fmt.Printf("英文字符个数为: %d\n 数字字符个数为: %d\n 空格字符个数为: %d\n 其他字符个数为: %d\n",
conutResult.englistCount, conutResult.numberCount, conutResult.spaceCount, conutResult.otherCount)
}
type Count struct {
englistCount int
numberCount int
spaceCount int
otherCount int
}
func countFile(stcStr string) (*Count) {
var count *Count = &Count{}
if stcStr == ""{
return nil
}
// 逐字符读取文件
file, err := os.OpenFile(stcStr, os.O_RDONLY, 0666)
if err != nil {
fmt.Printf("error: %v", err)
}
defer file.Close()
reader := bufio.NewReader(file)
for {
byteArr, _, err := reader.ReadLine()
if err == io.EOF{
break
}
for a := 0; a < len(byteArr); a++ {
tmp := byteArr[a]
if (tmp >= 65 && tmp <= 90) || (tmp >= 97 && tmp <= 122){
count.englistCount ++;
}else if tmp == ' ' {
count.spaceCount ++;
}else if tmp >= 48 && tmp <= 57{
count.numberCount ++;
}else{
count.otherCount ++;
}
}
}
return count
}