一:os.File封装了所有与文件操作有关的操作,File是结构体
①:常用操作
![](https://img-blog.csdnimg.cn/img_convert/39cd9122df41ccbcded68ca78229c721.png)
![](https://img-blog.csdnimg.cn/img_convert/3973494dc1daf8dd926bf0a09a19453a.png)
①:Read()举例,Read()取出len(b)的字节数据,并写入b中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package main import ( "fmt" "os" ) func main() { path := "d:/abc.txt" file, err := os.Open(path) if err != nil { fmt.Printf( "err=%v" ,err) return } defer file.Close() b := make([]byte, 5) count, err := file.Read(b) if err != nil { fmt.Printf( "err=" ,err) return } fmt.Println(count) fmt.Printf( "%c" ,b) } 结果 [ ` go run os. go ` | done ] 5 [h e l l o] |
其他方式使用大同小异。
二:打开文件与关闭文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" "os" ) func main() { path := "d:/abc.txt" file, err := os.Open(path) if err != nil { fmt.Printf( "err=%v" ,err) return } fmt.Println(file) defer file.Close() } 结果 [ ` go run os. go ` | done ] &{0xc000068780} |
由上结果可知,file为指针。
三:读文件操作应用
①:文件读取(适用于大小文件读取)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package main import ( "fmt" "os" "bufio" "io" ) func main() { path := "d:/abc.txt" file, err := os.Open(path) if err != nil { fmt.Printf( "err=%v" ,err) return }<br> //创建缓存空间读取文件 defer file.Close() reader := bufio.NewReader(file) for { str, err := reader.ReadString( '\n' ) if err == io.EOF { break } fmt.Printf(str) } } 结果 [ ` go run os. go ` | done ] hello golang hello golang hello golang |
②:一次性读取(建议小文件使用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package main import ( "fmt" "io/ioutil" ) func main() { path := "d:/abc.txt" //ioutil.ReadFile返回[]byte类型;ioutil.ReadFile()底层包含打开和关闭文件操作 content, err := ioutil.ReadFile(path) if err != nil { fmt.Printf( "读写出错err=%v\r\n" , err) return } fmt.Printf( "%T\n" ,content) fmt.Println(string(content)) } 结果 [ ` go run os. go ` | done ] []uint8 hello golang hello golang hello golang hello golang |
四:写文件操作
①:os.OpenFile()介绍
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
name:需要打开的文件目录名称
flag
![](https://img-blog.csdnimg.cn/img_convert/d162ba7549f6b8f5b54e39053c93fb25.gif)
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 // 如果可能,打开时清空文件
)
![](https://img-blog.csdnimg.cn/img_convert/e70a5de1294a573c15b8835b32231417.gif)
perm:权限控制
②:创建一个新文件,并写入"hello golang"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package main import ( "fmt" "os" "bufio" ) func main() { path := "d:/cw.txt" file, err := os.OpenFile(path, os.O_WRONLY | os.O_CREATE, 0666) if err != nil { fmt.Printf( "err=%v" , err) return } defer file.Close() str := "hello golang" //使用缓存方式写入 writer := bufio.NewWriter(file) count, w_err := writer.WriteString(str) //需要使用Flush()将写入到writer缓存的数据真正写入到cw.txt文件中 writer.Flush() if w_err != nil { fmt.Println( "写入出错" ) } else { fmt.Printf( "写入成功,共写入字节:%v" , count) } } 结果 [ ` go run os. go ` | done ] 写入成功,共写入字节:12 |
③:覆盖原有内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package main import ( "fmt" "os" "bufio" ) func main() { path := "d:/cw.txt" file, err := os.OpenFile(path, os.O_WRONLY | os.O_TRUNC, 0666) if err != nil { fmt.Printf( "err=%v" , err) return } defer file.Close() str := "hello world!" //使用缓存方式写入 writer := bufio.NewWriter(file) count, w_err := writer.WriteString(str) //需要使用Flush()将写入到writer缓存的数据真正写入到cw.txt问卷1中 writer.Flush() if w_err != nil { fmt.Println( "写入出错" ) } else { fmt.Printf( "写入成功,共写入字节:%v" , count) } } |
![](https://img-blog.csdnimg.cn/img_convert/b381850bfdb28587a1335e5f83536926.png)
cw.txt已由hello golang变为hello world!
备注:其实O_WRONLY默认就是覆盖之前的内容写入
④:文件内容最加
举例略,将上O_TRUNK改为O_APPEND即可
其他应用不再举例,结合①与②即可。
五:把一个文件内容写入到另一个文件(两个文件都必须存在)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package main import ( "fmt" "io/ioutil" ) func main() { path1 := "d:/cw.txt" path2 := "d:/abc.txt" content, err1 := ioutil.ReadFile(path1) if err1 != nil { fmt.Println(err1) return } err2 := ioutil.WriteFile(path2, content, 0666) if err2 != nil { fmt.Println(err2) } } |
![](https://img-blog.csdnimg.cn/img_convert/035806628b7f8c852983cb7eb51e3dbd.png)
六:判断文件或文件夹是否存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main import ( "fmt" "os" ) func main() { path1 := "d:/cw.txt" _, err1 := os.Stat(path1) if err1 != nil { fmt.Println( "文件不存在" ) return } fmt.Println( "文件存在" ) } |
七:文件拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package main import ( "fmt" "io" "os" ) func main() { path1 := "d:/cw.txt" path2 := "d:/qwer.txt" src, _ := os.OpenFile(path1,os.O_RDONLY,0666) defer src.Close() dsc, _ := os.OpenFile(path2, os.O_RDWR,0666) defer dsc.Close() //written代表写入的字节 written, err := io.Copy(dsc, src) if err != nil { fmt.Println(err) return } fmt.Println(written) } 结果 [ ` go run os. go ` | done ] 12 |
![](https://img-blog.csdnimg.cn/img_convert/fac9e9606383a88008aafbebd2f1bf71.png)