golang文件和目录操作

1,088 阅读3分钟

package main

import ( "bufio" "fmt" "io" "io/ioutil" "os" "strconv" )

/*

文件和目录操作
文件的读取
	一:读取文件(方法1)
		1:只读方式打开文件file,err:=os.Open()
		2:读取文件file.Read()
		3:关闭文件流Defer file.Close()

	二:读取文件(方法2)bufio读取文件
		1:只读方式打开文件file,err:=os.Open()
		2:创建Reader对象reader:=bufio.NewReader(file)
		3:ReadString读取文件 line,err:=reader.ReadString('\n')
		4:关闭文件流defer file.Close()
	三:读取文件(方法3)ioutil读取文件
		打开关闭文件的方法它都封装好了,只需要一句话就可以读取
		ioutil.ReadFile("./main.go")
文件的写入
	一:写入文件(方法1)
		//打开并创建对应的权限
		1:打开文件file,err:=os.OpenFile("I:/go/src/channel7/channel7.go",os.O_CREATE|OS.O_RDWR,0666)
		2:写入文件
		file.Write([]byte(str))//写入字节切片数据
		file.WriteString("直接写入的字符串数据")//直接写入字符串
		3:关闭文件流file.Close()
	二:写入文件(方法2)bufio写入文件
		1:打开文件file,err:=os.OpenFile("I:/go/src/channel7/channel7.go")
		2:创建Writer对象writer:=bufio.NewWriter(file)
		3:将数据先写入缓存writer.WriteString("hello golang")
		4:将缓存中的内容写入文件Writer.Flush()
		5:关闭文件游戏file.Close()
	三:写入文件(方法3)ioutil写入文件
		str:="hello golang"
		err:=ioutil.WriteFile("I:/go/src/channel7/channel7.go",[]byte(str),0666)

*/

func main() {

fmt.Println("---------------------file.Read读取文件(只读)")
//test1()
fmt.Println("---------------------bufio读取文件(只读)")
//test2()
fmt.Println("---------------------ioutil读取文件(只读)")
/*
	test3方法简单,适用于小文件
	不用手动关闭,判断是否读取完毕等
*/
//test3()

//////////////////////如下为写入
fmt.Println("---------------------file.WriteString写入文件")
//test4()
fmt.Println("---------------------bufio写入文件")
//test5()
fmt.Println("---------------------ioutil写入文件")
test6()
}

func test6() {

str := "hello golang111111111111"
err := ioutil.WriteFile("./test.txt", []byte(str), 0666)
if err != nil {
	fmt.Println("写入文件失败,err", err)
	return
}
/*
	直接清空????
*/

} func test5() {

file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
defer file.Close()
if err != nil {
	fmt.Println("打开文件失败")
	return
}
writer := bufio.NewWriter(file)
/*
	//方法一:单条写入
	writer.WriteString("hello golang") //将数据写入缓存,注意,一定要紧跟一个writer.Flush()
	writer.Flush()
*/
for i := 0; i < 10; i++ {
	writer.WriteString("hello golang" + strconv.Itoa(i) + "\r\n")
}
writer.Flush()

}

func test4() {

/*
	func OpenFile(name string,flag int,perm FileMode)(*File,error)
	name:要打开的文件名
	flag:打开文件的模式:
		os.O_WRONLY		只写
		os.O_CREATE		创建文件
		os.O_RDONLY		只读
		os.O_RDWR		读写
		os.O_TRUNC		清空
		os.O_APPEND		追加
	perm:文件权限,一个8进制数:r(读)04,w(写)02,x(执行)01
		//主要给Linux使用的
		//一般写0666即所有组合都有权限


*/
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
defer file.Close()
if err != nil {
	fmt.Println("打开失败")
	return
}
/*
	//方式一:
	file.WriteString("直接写入的字符串")//一次只写入一行数据
	//要写入多行,则使用for循环
*/
/*
	//方式一循环
	for i := 0; i < 10; i++ {
		//如果是txt文件,必须是\r\n
		file.WriteString("直接写入的字符串" + strconv.Itoa(i) + "\r\n") //一次只写入一行数据
	}
*/
//方式二
var str = "直接写入字符串"
file.Write([]byte(str))

} func test3() {

byteStr, err := ioutil.ReadFile("I:/go/src/channel7/channel7.go")
if err != nil {
	fmt.Println("打开失败")
	return
}
fmt.Println(string(byteStr))

}

func test2() {

file, err := os.Open("I:/go/src/channel7/channel7.go")
defer file.Close()
if err != nil {
	fmt.Println("打开失败")
	return
}
reader := bufio.NewReader(file)
var fileStr string
for {
	str, err := reader.ReadString('\n') //一次读取一行
	if err == io.EOF {
		fmt.Println("读取完毕")
		fileStr += str //因为在读取完毕前,可能还有数据,所以需要再加一条
		break
	}
	if err != nil {
		fmt.Println(err)
		return
	}
	fileStr += str
}
fmt.Println(fileStr)
/*
	str, err := reader.ReadString('\n') //表示一次读取一行
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(str)
*/ //因为是一次读取一行,所以还是通过For循环来进行读取

} func test1() { //以只读方法打开文件 //打开文件

file, err := os.Open("I:/go/src/channel7/channel7.go") //绝对路径
//file, err := os.Open("./fileDir.go")//相对路径
defer file.Close()
if err != nil {
	fmt.Println("打开失败")
	return
}
fmt.Println(file) //&{0xc000122780}//一个指针类型的返回值

//2:读取文件
//由于返回值是一个[]byte,所以先定义个切片
var tempSlice = make([]byte, 128) //128表示每次读取多少个字节

/*
	n, err := file.Read(tempSlice)
	if err != nil {
		fmt.Println("读取失败")
	}
	fmt.Printf("读取到了%v个字节\n", n)
	fmt.Println(string(tempSlice))//这里只显示了文件的一部份内容,因为每次只读取128个字节的内容,解决办法为:使用For循环读取
*/
var strSlice []byte
for {
	n, err := file.Read(tempSlice)
	if err == io.EOF {
		fmt.Println("读取完毕")
		return
	}
	if err != nil {
		fmt.Println("读取失败")
		return
	}
	//strSlice = append(strSlice, tempSlice...)//由于是切片,每次读取128字节.将会在最后出错,所以改为下行.并将返回的N取回
	strSlice = append(strSlice, tempSlice[:n]...)
	fmt.Println(string(strSlice))
}

}