2019-01-18 Golang学习笔记-文件操作

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
}

你可能感兴趣的:(Go)